@inkeep/agents-manage-api 0.39.5 → 0.40.0
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/dist/create-app.d.ts +21 -0
- package/dist/create-app.js +144 -0
- package/dist/data/agentFull.d.ts +15 -0
- package/dist/data/agentFull.js +84 -0
- package/dist/data/conversations.d.ts +77 -0
- package/dist/data/conversations.js +152 -0
- package/dist/data/db/dbClient.d.ts +6 -0
- package/dist/data/db/dbClient.js +17 -0
- package/dist/env.d.ts +61 -0
- package/dist/env.js +55 -0
- package/dist/factory.d.ts +17 -2
- package/dist/factory.js +35 -2
- package/dist/index.d.ts +119 -22
- package/dist/index.js +8 -5
- package/dist/initialization.d.ts +6 -0
- package/dist/initialization.js +79 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.js +3 -0
- package/dist/middleware/auth.d.ts +24 -0
- package/dist/middleware/auth.js +55 -0
- package/dist/middleware/error-handler.d.ts +12 -0
- package/dist/middleware/error-handler.js +88 -0
- package/dist/middleware/require-permission.d.ts +19 -0
- package/dist/middleware/require-permission.js +80 -0
- package/dist/middleware/session-auth.d.ts +6 -0
- package/dist/middleware/session-auth.js +26 -0
- package/dist/middleware/tenant-access.d.ts +12 -0
- package/dist/middleware/tenant-access.js +54 -0
- package/dist/openapi.d.ts +7 -0
- package/dist/openapi.js +157 -0
- package/dist/routes/agent.d.ts +9 -0
- package/dist/routes/agent.js +244 -0
- package/dist/routes/agentFull.d.ts +9 -0
- package/dist/routes/agentFull.js +188 -0
- package/dist/routes/agentToolRelations.d.ts +9 -0
- package/dist/routes/agentToolRelations.js +284 -0
- package/dist/routes/apiKeys.d.ts +9 -0
- package/dist/routes/apiKeys.js +217 -0
- package/dist/routes/artifactComponents.d.ts +9 -0
- package/dist/routes/artifactComponents.js +204 -0
- package/dist/routes/cliAuth.d.ts +9 -0
- package/dist/routes/cliAuth.js +60 -0
- package/dist/routes/contextConfigs.d.ts +9 -0
- package/dist/routes/contextConfigs.js +175 -0
- package/dist/routes/conversations.d.ts +7 -0
- package/dist/routes/conversations.js +59 -0
- package/dist/routes/credentialStores.d.ts +9 -0
- package/dist/routes/credentialStores.js +81 -0
- package/dist/routes/credentials.d.ts +9 -0
- package/dist/routes/credentials.js +204 -0
- package/dist/routes/dataComponents.d.ts +9 -0
- package/dist/routes/dataComponents.js +188 -0
- package/dist/routes/externalAgents.d.ts +9 -0
- package/dist/routes/externalAgents.js +195 -0
- package/dist/routes/functionTools.d.ts +9 -0
- package/dist/routes/functionTools.js +252 -0
- package/dist/routes/functions.d.ts +9 -0
- package/dist/routes/functions.js +281 -0
- package/dist/routes/index.d.ts +7 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/invitations.d.ts +9 -0
- package/dist/routes/invitations.js +41 -0
- package/dist/routes/mcp.d.ts +7 -0
- package/dist/routes/mcp.js +45 -0
- package/dist/routes/mcpCatalog.d.ts +13 -0
- package/dist/routes/mcpCatalog.js +454 -0
- package/dist/routes/oauth.d.ts +10 -0
- package/dist/routes/oauth.js +314 -0
- package/dist/routes/playgroundToken.d.ts +9 -0
- package/dist/routes/playgroundToken.js +108 -0
- package/dist/routes/projectFull.d.ts +9 -0
- package/dist/routes/projectFull.js +193 -0
- package/dist/routes/projects.d.ts +9 -0
- package/dist/routes/projects.js +188 -0
- package/dist/routes/shared.d.ts +93 -0
- package/dist/routes/shared.js +44 -0
- package/dist/routes/signoz.d.ts +10 -0
- package/dist/routes/signoz.js +155 -0
- package/dist/routes/subAgentArtifactComponents.d.ts +9 -0
- package/dist/routes/subAgentArtifactComponents.js +198 -0
- package/dist/routes/subAgentDataComponents.d.ts +9 -0
- package/dist/routes/subAgentDataComponents.js +197 -0
- package/dist/routes/subAgentExternalAgentRelations.d.ts +9 -0
- package/dist/routes/subAgentExternalAgentRelations.js +213 -0
- package/dist/routes/subAgentRelations.d.ts +9 -0
- package/dist/routes/subAgentRelations.js +259 -0
- package/dist/routes/subAgentTeamAgentRelations.d.ts +9 -0
- package/dist/routes/subAgentTeamAgentRelations.js +213 -0
- package/dist/routes/subAgentToolRelations.d.ts +9 -0
- package/dist/routes/subAgentToolRelations.js +284 -0
- package/dist/routes/subAgents.d.ts +9 -0
- package/dist/routes/subAgents.js +210 -0
- package/dist/routes/thirdPartyMCPServers.d.ts +14 -0
- package/dist/routes/thirdPartyMCPServers.js +72 -0
- package/dist/routes/tools.d.ts +9 -0
- package/dist/routes/tools.js +256 -0
- package/dist/routes/userOrganizations.d.ts +9 -0
- package/dist/routes/userOrganizations.js +58 -0
- package/dist/sso-helpers.d.ts +20 -0
- package/dist/sso-helpers.js +51 -0
- package/dist/types/app.d.ts +47 -0
- package/dist/types/app.js +1 -0
- package/dist/utils/cors.d.ts +33 -0
- package/dist/utils/cors.js +98 -0
- package/dist/utils/oauth-service.d.ts +71 -0
- package/dist/utils/oauth-service.js +106 -0
- package/dist/utils/signoz-helpers.d.ts +9 -0
- package/dist/utils/signoz-helpers.js +33 -0
- package/dist/utils/temp-api-keys.d.ts +17 -0
- package/dist/utils/temp-api-keys.js +26 -0
- package/package.json +6 -13
- package/dist/chunk-VBDAOXYI.js +0 -832
- package/dist/chunk-VBDAOXYI.js.map +0 -1
- package/dist/factory2.d.ts +0 -41
- package/dist/factory2.d.ts.map +0 -1
- package/dist/factory2.js +0 -37085
- package/dist/factory2.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/nodefs.js +0 -27
- package/dist/nodefs.js.map +0 -1
- package/dist/opfs-ahp.js +0 -368
- package/dist/opfs-ahp.js.map +0 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { getLogger as getLogger$1 } from "../logger.js";
|
|
2
|
+
import dbClient_default from "../data/db/dbClient.js";
|
|
3
|
+
import { requirePermission } from "../middleware/require-permission.js";
|
|
4
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
5
|
+
import { AgentWithinContextOfProjectResponse, AgentWithinContextOfProjectSchema, ErrorResponseSchema, TenantProjectAgentParamsSchema, TenantProjectParamsSchema, commonGetErrorResponses, createApiError, createFullAgentServerSide, deleteFullAgent, getFullAgent, updateFullAgentServerSide } from "@inkeep/agents-core";
|
|
6
|
+
|
|
7
|
+
//#region src/routes/agentFull.ts
|
|
8
|
+
const logger = getLogger$1("agentFull");
|
|
9
|
+
const app = new OpenAPIHono();
|
|
10
|
+
app.use("/", async (c, next) => {
|
|
11
|
+
if (c.req.method === "POST") return requirePermission({ agent: ["create"] })(c, next);
|
|
12
|
+
return next();
|
|
13
|
+
});
|
|
14
|
+
app.use("/:agentId", async (c, next) => {
|
|
15
|
+
if (c.req.method === "PUT") return requirePermission({ agent: ["update"] })(c, next);
|
|
16
|
+
if (c.req.method === "DELETE") return requirePermission({ agent: ["delete"] })(c, next);
|
|
17
|
+
return next();
|
|
18
|
+
});
|
|
19
|
+
app.openapi(createRoute({
|
|
20
|
+
method: "post",
|
|
21
|
+
path: "/",
|
|
22
|
+
summary: "Create Full Agent",
|
|
23
|
+
operationId: "create-full-agent",
|
|
24
|
+
tags: ["Full Agent"],
|
|
25
|
+
description: "Create a complete agent with all agents, tools, and relationships from JSON definition",
|
|
26
|
+
request: {
|
|
27
|
+
params: TenantProjectParamsSchema,
|
|
28
|
+
body: { content: { "application/json": { schema: AgentWithinContextOfProjectSchema } } }
|
|
29
|
+
},
|
|
30
|
+
responses: {
|
|
31
|
+
201: {
|
|
32
|
+
description: "Full agent created successfully",
|
|
33
|
+
content: { "application/json": { schema: AgentWithinContextOfProjectResponse } }
|
|
34
|
+
},
|
|
35
|
+
409: {
|
|
36
|
+
description: "Agent already exists",
|
|
37
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
38
|
+
},
|
|
39
|
+
...commonGetErrorResponses
|
|
40
|
+
}
|
|
41
|
+
}), async (c) => {
|
|
42
|
+
const { tenantId, projectId } = c.req.valid("param");
|
|
43
|
+
const agentData = c.req.valid("json");
|
|
44
|
+
const validatedAgentData = AgentWithinContextOfProjectSchema.parse(agentData);
|
|
45
|
+
const createdAgent = await createFullAgentServerSide(dbClient_default, logger)({
|
|
46
|
+
tenantId,
|
|
47
|
+
projectId
|
|
48
|
+
}, validatedAgentData);
|
|
49
|
+
return c.json({ data: createdAgent }, 201);
|
|
50
|
+
});
|
|
51
|
+
app.openapi(createRoute({
|
|
52
|
+
method: "get",
|
|
53
|
+
path: "/{agentId}",
|
|
54
|
+
summary: "Get Full Agent",
|
|
55
|
+
operationId: "get-full-agent",
|
|
56
|
+
tags: ["Full Agent"],
|
|
57
|
+
description: "Retrieve a complete agent definition with all agents, tools, and relationships",
|
|
58
|
+
request: { params: TenantProjectAgentParamsSchema },
|
|
59
|
+
responses: {
|
|
60
|
+
200: {
|
|
61
|
+
description: "Full agent found",
|
|
62
|
+
content: { "application/json": { schema: AgentWithinContextOfProjectResponse } }
|
|
63
|
+
},
|
|
64
|
+
...commonGetErrorResponses
|
|
65
|
+
}
|
|
66
|
+
}), async (c) => {
|
|
67
|
+
const { tenantId, projectId, agentId } = c.req.valid("param");
|
|
68
|
+
try {
|
|
69
|
+
const agent = await getFullAgent(dbClient_default, logger)({ scopes: {
|
|
70
|
+
tenantId,
|
|
71
|
+
projectId,
|
|
72
|
+
agentId
|
|
73
|
+
} });
|
|
74
|
+
if (!agent) throw createApiError({
|
|
75
|
+
code: "not_found",
|
|
76
|
+
message: "Agent not found"
|
|
77
|
+
});
|
|
78
|
+
return c.json({ data: agent });
|
|
79
|
+
} catch (error) {
|
|
80
|
+
if (error instanceof Error && error.message.includes("not found")) throw createApiError({
|
|
81
|
+
code: "not_found",
|
|
82
|
+
message: "Agent not found"
|
|
83
|
+
});
|
|
84
|
+
throw createApiError({
|
|
85
|
+
code: "internal_server_error",
|
|
86
|
+
message: error instanceof Error ? error.message : "Failed to retrieve agent"
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
app.openapi(createRoute({
|
|
91
|
+
method: "put",
|
|
92
|
+
path: "/{agentId}",
|
|
93
|
+
summary: "Update Full Agent",
|
|
94
|
+
operationId: "update-full-agent",
|
|
95
|
+
tags: ["Full Agent"],
|
|
96
|
+
description: "Update or create a complete agent with all agents, tools, and relationships from JSON definition",
|
|
97
|
+
request: {
|
|
98
|
+
params: TenantProjectAgentParamsSchema,
|
|
99
|
+
body: { content: { "application/json": { schema: AgentWithinContextOfProjectSchema } } }
|
|
100
|
+
},
|
|
101
|
+
responses: {
|
|
102
|
+
200: {
|
|
103
|
+
description: "Full agent updated successfully",
|
|
104
|
+
content: { "application/json": { schema: AgentWithinContextOfProjectResponse } }
|
|
105
|
+
},
|
|
106
|
+
201: {
|
|
107
|
+
description: "Full agent created successfully",
|
|
108
|
+
content: { "application/json": { schema: AgentWithinContextOfProjectResponse } }
|
|
109
|
+
},
|
|
110
|
+
...commonGetErrorResponses
|
|
111
|
+
}
|
|
112
|
+
}), async (c) => {
|
|
113
|
+
const { tenantId, projectId, agentId } = c.req.valid("param");
|
|
114
|
+
const agentData = c.req.valid("json");
|
|
115
|
+
try {
|
|
116
|
+
logger.info({}, "test agent data");
|
|
117
|
+
const validatedAgentData = AgentWithinContextOfProjectSchema.parse(agentData);
|
|
118
|
+
if (agentId !== validatedAgentData.id) throw createApiError({
|
|
119
|
+
code: "bad_request",
|
|
120
|
+
message: `Agent ID mismatch: expected ${agentId}, got ${validatedAgentData.id}`
|
|
121
|
+
});
|
|
122
|
+
const isCreate = !await getFullAgent(dbClient_default, logger)({ scopes: {
|
|
123
|
+
tenantId,
|
|
124
|
+
projectId,
|
|
125
|
+
agentId
|
|
126
|
+
} });
|
|
127
|
+
const updatedAgent = isCreate ? await createFullAgentServerSide(dbClient_default, logger)({
|
|
128
|
+
tenantId,
|
|
129
|
+
projectId
|
|
130
|
+
}, validatedAgentData) : await updateFullAgentServerSide(dbClient_default, logger)({
|
|
131
|
+
tenantId,
|
|
132
|
+
projectId
|
|
133
|
+
}, validatedAgentData);
|
|
134
|
+
return c.json({ data: updatedAgent }, isCreate ? 201 : 200);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
if (error instanceof z.ZodError) throw createApiError({
|
|
137
|
+
code: "bad_request",
|
|
138
|
+
message: "Invalid agent definition"
|
|
139
|
+
});
|
|
140
|
+
if (error instanceof Error && error.message.includes("ID mismatch")) throw createApiError({
|
|
141
|
+
code: "bad_request",
|
|
142
|
+
message: error.message
|
|
143
|
+
});
|
|
144
|
+
throw createApiError({
|
|
145
|
+
code: "internal_server_error",
|
|
146
|
+
message: error instanceof Error ? error.message : "Failed to update agent"
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
app.openapi(createRoute({
|
|
151
|
+
method: "delete",
|
|
152
|
+
path: "/{agentId}",
|
|
153
|
+
summary: "Delete Full Agent",
|
|
154
|
+
operationId: "delete-full-agent",
|
|
155
|
+
tags: ["Full Agent"],
|
|
156
|
+
description: "Delete a complete agent and cascade to all related entities (relationships, not other agents/tools)",
|
|
157
|
+
request: { params: TenantProjectAgentParamsSchema },
|
|
158
|
+
responses: {
|
|
159
|
+
204: { description: "Agent deleted successfully" },
|
|
160
|
+
...commonGetErrorResponses
|
|
161
|
+
}
|
|
162
|
+
}), async (c) => {
|
|
163
|
+
const { tenantId, projectId, agentId } = c.req.valid("param");
|
|
164
|
+
try {
|
|
165
|
+
if (!await deleteFullAgent(dbClient_default, logger)({ scopes: {
|
|
166
|
+
tenantId,
|
|
167
|
+
projectId,
|
|
168
|
+
agentId
|
|
169
|
+
} })) throw createApiError({
|
|
170
|
+
code: "not_found",
|
|
171
|
+
message: "Agent not found"
|
|
172
|
+
});
|
|
173
|
+
return c.body(null, 204);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
if (error instanceof Error && error.message.includes("not found")) throw createApiError({
|
|
176
|
+
code: "not_found",
|
|
177
|
+
message: "Agent not found"
|
|
178
|
+
});
|
|
179
|
+
throw createApiError({
|
|
180
|
+
code: "internal_server_error",
|
|
181
|
+
message: error instanceof Error ? error.message : "Failed to delete agent"
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
var agentFull_default = app;
|
|
186
|
+
|
|
187
|
+
//#endregion
|
|
188
|
+
export { agentFull_default as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseAppVariables } from "../types/app.js";
|
|
2
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
3
|
+
|
|
4
|
+
//#region src/routes/agentToolRelations.d.ts
|
|
5
|
+
declare const app: OpenAPIHono<{
|
|
6
|
+
Variables: BaseAppVariables;
|
|
7
|
+
}, {}, "/">;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { app as default };
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import dbClient_default from "../data/db/dbClient.js";
|
|
2
|
+
import { requirePermission } from "../middleware/require-permission.js";
|
|
3
|
+
import { speakeasyOffsetLimitPagination } from "./shared.js";
|
|
4
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
5
|
+
import { ErrorResponseSchema, PaginationQueryParamsSchema, SubAgentToolRelationApiInsertSchema, SubAgentToolRelationApiUpdateSchema, SubAgentToolRelationListResponse, SubAgentToolRelationResponse, TenantProjectAgentIdParamsSchema, TenantProjectAgentParamsSchema, commonGetErrorResponses, createAgentToolRelation, createApiError, deleteAgentToolRelation, getAgentToolRelationByAgent, getAgentToolRelationById, getAgentToolRelationByTool, getAgentsForTool, listAgentToolRelations, updateAgentToolRelation } from "@inkeep/agents-core";
|
|
6
|
+
|
|
7
|
+
//#region src/routes/agentToolRelations.ts
|
|
8
|
+
const app = new OpenAPIHono();
|
|
9
|
+
app.use("/", async (c, next) => {
|
|
10
|
+
if (c.req.method === "POST") return requirePermission({ agent: ["create"] })(c, next);
|
|
11
|
+
return next();
|
|
12
|
+
});
|
|
13
|
+
app.use("/:id", async (c, next) => {
|
|
14
|
+
if (c.req.method === "PUT") return requirePermission({ agent: ["update"] })(c, next);
|
|
15
|
+
if (c.req.method === "DELETE") return requirePermission({ agent: ["delete"] })(c, next);
|
|
16
|
+
return next();
|
|
17
|
+
});
|
|
18
|
+
app.openapi(createRoute({
|
|
19
|
+
method: "get",
|
|
20
|
+
path: "/",
|
|
21
|
+
summary: "List Agent Tool Relations",
|
|
22
|
+
operationId: "list-agent-tool-relations",
|
|
23
|
+
tags: ["Agent Tool Relations"],
|
|
24
|
+
request: {
|
|
25
|
+
params: TenantProjectAgentParamsSchema,
|
|
26
|
+
query: PaginationQueryParamsSchema.extend({
|
|
27
|
+
subAgentId: z.string().optional(),
|
|
28
|
+
toolId: z.string().optional()
|
|
29
|
+
})
|
|
30
|
+
},
|
|
31
|
+
responses: {
|
|
32
|
+
200: {
|
|
33
|
+
description: "List of agent tool relations retrieved successfully",
|
|
34
|
+
content: { "application/json": { schema: SubAgentToolRelationListResponse } }
|
|
35
|
+
},
|
|
36
|
+
...commonGetErrorResponses
|
|
37
|
+
},
|
|
38
|
+
...speakeasyOffsetLimitPagination
|
|
39
|
+
}), async (c) => {
|
|
40
|
+
const { tenantId, projectId, agentId } = c.req.valid("param");
|
|
41
|
+
const { page, limit, subAgentId, toolId } = c.req.valid("query");
|
|
42
|
+
let result;
|
|
43
|
+
if (subAgentId) {
|
|
44
|
+
const dbResult = await getAgentToolRelationByAgent(dbClient_default)({
|
|
45
|
+
scopes: {
|
|
46
|
+
tenantId,
|
|
47
|
+
projectId,
|
|
48
|
+
agentId,
|
|
49
|
+
subAgentId
|
|
50
|
+
},
|
|
51
|
+
pagination: {
|
|
52
|
+
page,
|
|
53
|
+
limit
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
result = {
|
|
57
|
+
data: dbResult.data,
|
|
58
|
+
pagination: dbResult.pagination
|
|
59
|
+
};
|
|
60
|
+
} else if (toolId) {
|
|
61
|
+
const dbResult = await getAgentToolRelationByTool(dbClient_default)({
|
|
62
|
+
scopes: {
|
|
63
|
+
tenantId,
|
|
64
|
+
projectId,
|
|
65
|
+
agentId
|
|
66
|
+
},
|
|
67
|
+
toolId,
|
|
68
|
+
pagination: {
|
|
69
|
+
page,
|
|
70
|
+
limit
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
result = {
|
|
74
|
+
data: dbResult.data,
|
|
75
|
+
pagination: dbResult.pagination
|
|
76
|
+
};
|
|
77
|
+
} else {
|
|
78
|
+
const dbResult = await listAgentToolRelations(dbClient_default)({
|
|
79
|
+
scopes: {
|
|
80
|
+
tenantId,
|
|
81
|
+
projectId,
|
|
82
|
+
agentId
|
|
83
|
+
},
|
|
84
|
+
pagination: {
|
|
85
|
+
page,
|
|
86
|
+
limit
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
result = {
|
|
90
|
+
data: dbResult.data,
|
|
91
|
+
pagination: dbResult.pagination
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return c.json(result);
|
|
95
|
+
});
|
|
96
|
+
app.openapi(createRoute({
|
|
97
|
+
method: "get",
|
|
98
|
+
path: "/{id}",
|
|
99
|
+
summary: "Get Agent Tool Relation",
|
|
100
|
+
operationId: "get-agent-tool-relation",
|
|
101
|
+
tags: ["Agent Tool Relations"],
|
|
102
|
+
request: { params: TenantProjectAgentIdParamsSchema },
|
|
103
|
+
responses: {
|
|
104
|
+
200: {
|
|
105
|
+
description: "Agent tool relation found",
|
|
106
|
+
content: { "application/json": { schema: SubAgentToolRelationResponse } }
|
|
107
|
+
},
|
|
108
|
+
...commonGetErrorResponses
|
|
109
|
+
}
|
|
110
|
+
}), async (c) => {
|
|
111
|
+
const { tenantId, projectId, agentId, id } = c.req.valid("param");
|
|
112
|
+
const agentToolRelation = await getAgentToolRelationById(dbClient_default)({
|
|
113
|
+
scopes: {
|
|
114
|
+
tenantId,
|
|
115
|
+
projectId,
|
|
116
|
+
agentId,
|
|
117
|
+
subAgentId: id
|
|
118
|
+
},
|
|
119
|
+
relationId: id
|
|
120
|
+
});
|
|
121
|
+
if (!agentToolRelation) throw createApiError({
|
|
122
|
+
code: "not_found",
|
|
123
|
+
message: "Agent tool relation not found"
|
|
124
|
+
});
|
|
125
|
+
return c.json({ data: agentToolRelation });
|
|
126
|
+
});
|
|
127
|
+
app.openapi(createRoute({
|
|
128
|
+
method: "get",
|
|
129
|
+
path: "/tool/{toolId}/agents",
|
|
130
|
+
summary: "Get Agents for Tool",
|
|
131
|
+
operationId: "get-agents-for-tool",
|
|
132
|
+
tags: ["Agent Tool Relations"],
|
|
133
|
+
request: {
|
|
134
|
+
params: TenantProjectAgentParamsSchema.extend({ toolId: z.string() }),
|
|
135
|
+
query: PaginationQueryParamsSchema
|
|
136
|
+
},
|
|
137
|
+
responses: {
|
|
138
|
+
200: {
|
|
139
|
+
description: "Agents for tool retrieved successfully",
|
|
140
|
+
content: { "application/json": { schema: SubAgentToolRelationListResponse } }
|
|
141
|
+
},
|
|
142
|
+
...commonGetErrorResponses
|
|
143
|
+
}
|
|
144
|
+
}), async (c) => {
|
|
145
|
+
const { tenantId, projectId, agentId, toolId } = c.req.valid("param");
|
|
146
|
+
const { page, limit } = c.req.valid("query");
|
|
147
|
+
const dbResult = await getAgentsForTool(dbClient_default)({
|
|
148
|
+
scopes: {
|
|
149
|
+
tenantId,
|
|
150
|
+
projectId,
|
|
151
|
+
agentId
|
|
152
|
+
},
|
|
153
|
+
toolId,
|
|
154
|
+
pagination: {
|
|
155
|
+
page,
|
|
156
|
+
limit
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return c.json(dbResult);
|
|
160
|
+
});
|
|
161
|
+
app.openapi(createRoute({
|
|
162
|
+
method: "post",
|
|
163
|
+
path: "/",
|
|
164
|
+
summary: "Create Agent Tool Relation",
|
|
165
|
+
operationId: "create-agent-tool-relation",
|
|
166
|
+
tags: ["Agent Tool Relations"],
|
|
167
|
+
request: {
|
|
168
|
+
params: TenantProjectAgentParamsSchema,
|
|
169
|
+
body: { content: { "application/json": { schema: SubAgentToolRelationApiInsertSchema } } }
|
|
170
|
+
},
|
|
171
|
+
responses: {
|
|
172
|
+
201: {
|
|
173
|
+
description: "Agent tool relation created successfully",
|
|
174
|
+
content: { "application/json": { schema: SubAgentToolRelationResponse } }
|
|
175
|
+
},
|
|
176
|
+
...commonGetErrorResponses
|
|
177
|
+
}
|
|
178
|
+
}), async (c) => {
|
|
179
|
+
const { tenantId, projectId, agentId } = c.req.valid("param");
|
|
180
|
+
const body = c.req.valid("json");
|
|
181
|
+
if ((await listAgentToolRelations(dbClient_default)({
|
|
182
|
+
scopes: {
|
|
183
|
+
tenantId,
|
|
184
|
+
projectId,
|
|
185
|
+
agentId
|
|
186
|
+
},
|
|
187
|
+
pagination: { limit: 1e3 }
|
|
188
|
+
})).data.some((relation) => {
|
|
189
|
+
const typedRelation = relation;
|
|
190
|
+
return typedRelation.subAgentId === body.subAgentId && typedRelation.toolId === body.toolId;
|
|
191
|
+
})) throw createApiError({
|
|
192
|
+
code: "unprocessable_entity",
|
|
193
|
+
message: "Agent tool relation already exists"
|
|
194
|
+
});
|
|
195
|
+
try {
|
|
196
|
+
const agentToolRelation = await createAgentToolRelation(dbClient_default)({
|
|
197
|
+
scopes: {
|
|
198
|
+
tenantId,
|
|
199
|
+
projectId,
|
|
200
|
+
agentId
|
|
201
|
+
},
|
|
202
|
+
data: body
|
|
203
|
+
});
|
|
204
|
+
return c.json({ data: agentToolRelation }, 201);
|
|
205
|
+
} catch (error) {
|
|
206
|
+
if (error?.cause?.code === "23503") throw createApiError({
|
|
207
|
+
code: "bad_request",
|
|
208
|
+
message: "Invalid agent ID or tool ID - referenced entity does not exist"
|
|
209
|
+
});
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
app.openapi(createRoute({
|
|
214
|
+
method: "put",
|
|
215
|
+
path: "/{id}",
|
|
216
|
+
summary: "Update Agent Tool Relation",
|
|
217
|
+
operationId: "update-agent-tool-relation",
|
|
218
|
+
tags: ["Agent Tool Relations"],
|
|
219
|
+
request: {
|
|
220
|
+
params: TenantProjectAgentIdParamsSchema,
|
|
221
|
+
body: { content: { "application/json": { schema: SubAgentToolRelationApiUpdateSchema } } }
|
|
222
|
+
},
|
|
223
|
+
responses: {
|
|
224
|
+
200: {
|
|
225
|
+
description: "Agent tool relation updated successfully",
|
|
226
|
+
content: { "application/json": { schema: SubAgentToolRelationResponse } }
|
|
227
|
+
},
|
|
228
|
+
...commonGetErrorResponses
|
|
229
|
+
}
|
|
230
|
+
}), async (c) => {
|
|
231
|
+
const { tenantId, projectId, agentId, id } = c.req.valid("param");
|
|
232
|
+
const body = await c.req.valid("json");
|
|
233
|
+
if (Object.keys(body).length === 0) throw createApiError({
|
|
234
|
+
code: "bad_request",
|
|
235
|
+
message: "No fields to update"
|
|
236
|
+
});
|
|
237
|
+
const updatedSubAgentToolRelation = await updateAgentToolRelation(dbClient_default)({
|
|
238
|
+
scopes: {
|
|
239
|
+
tenantId,
|
|
240
|
+
projectId,
|
|
241
|
+
agentId
|
|
242
|
+
},
|
|
243
|
+
relationId: id,
|
|
244
|
+
data: body
|
|
245
|
+
});
|
|
246
|
+
if (!updatedSubAgentToolRelation) throw createApiError({
|
|
247
|
+
code: "not_found",
|
|
248
|
+
message: "Agent tool relation not found"
|
|
249
|
+
});
|
|
250
|
+
return c.json({ data: updatedSubAgentToolRelation });
|
|
251
|
+
});
|
|
252
|
+
app.openapi(createRoute({
|
|
253
|
+
method: "delete",
|
|
254
|
+
path: "/{id}",
|
|
255
|
+
summary: "Delete Agent Tool Relation",
|
|
256
|
+
operationId: "delete-agent-tool-relation",
|
|
257
|
+
tags: ["Agent Tool Relations"],
|
|
258
|
+
request: { params: TenantProjectAgentIdParamsSchema },
|
|
259
|
+
responses: {
|
|
260
|
+
204: { description: "Agent tool relation deleted successfully" },
|
|
261
|
+
404: {
|
|
262
|
+
description: "Agent tool relation not found",
|
|
263
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}), async (c) => {
|
|
267
|
+
const { tenantId, projectId, agentId, id } = c.req.valid("param");
|
|
268
|
+
if (!await deleteAgentToolRelation(dbClient_default)({
|
|
269
|
+
scopes: {
|
|
270
|
+
tenantId,
|
|
271
|
+
projectId,
|
|
272
|
+
agentId
|
|
273
|
+
},
|
|
274
|
+
relationId: id
|
|
275
|
+
})) throw createApiError({
|
|
276
|
+
code: "not_found",
|
|
277
|
+
message: "Agent tool relation not found"
|
|
278
|
+
});
|
|
279
|
+
return c.body(null, 204);
|
|
280
|
+
});
|
|
281
|
+
var agentToolRelations_default = app;
|
|
282
|
+
|
|
283
|
+
//#endregion
|
|
284
|
+
export { agentToolRelations_default as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseAppVariables } from "../types/app.js";
|
|
2
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
3
|
+
|
|
4
|
+
//#region src/routes/apiKeys.d.ts
|
|
5
|
+
declare const app: OpenAPIHono<{
|
|
6
|
+
Variables: BaseAppVariables;
|
|
7
|
+
}, {}, "/">;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { app as default };
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import dbClient_default from "../data/db/dbClient.js";
|
|
2
|
+
import { requirePermission } from "../middleware/require-permission.js";
|
|
3
|
+
import { speakeasyOffsetLimitPagination } from "./shared.js";
|
|
4
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
5
|
+
import { ApiKeyApiCreationResponseSchema, ApiKeyApiInsertSchema, ApiKeyApiUpdateSchema, ApiKeyListResponse, ApiKeyResponse, ErrorResponseSchema, PaginationQueryParamsSchema, TenantProjectIdParamsSchema, TenantProjectParamsSchema, commonGetErrorResponses, createApiError, createApiKey, deleteApiKey, generateApiKey, getApiKeyById, listApiKeysPaginated, updateApiKey } from "@inkeep/agents-core";
|
|
6
|
+
|
|
7
|
+
//#region src/routes/apiKeys.ts
|
|
8
|
+
const app = new OpenAPIHono();
|
|
9
|
+
app.use("/", async (c, next) => {
|
|
10
|
+
if (c.req.method === "POST") return requirePermission({ api_key: ["create"] })(c, next);
|
|
11
|
+
return next();
|
|
12
|
+
});
|
|
13
|
+
app.use("/:id", async (c, next) => {
|
|
14
|
+
if (c.req.method === "PATCH") return requirePermission({ api_key: ["update"] })(c, next);
|
|
15
|
+
if (c.req.method === "DELETE") return requirePermission({ api_key: ["delete"] })(c, next);
|
|
16
|
+
return next();
|
|
17
|
+
});
|
|
18
|
+
app.openapi(createRoute({
|
|
19
|
+
method: "get",
|
|
20
|
+
path: "/",
|
|
21
|
+
summary: "List API Keys",
|
|
22
|
+
description: "List all API keys for a tenant with optional pagination",
|
|
23
|
+
operationId: "list-api-keys",
|
|
24
|
+
tags: ["API Keys"],
|
|
25
|
+
request: {
|
|
26
|
+
params: TenantProjectParamsSchema,
|
|
27
|
+
query: PaginationQueryParamsSchema.extend({ agentId: z.string().optional().describe("Filter by agent ID") })
|
|
28
|
+
},
|
|
29
|
+
responses: {
|
|
30
|
+
200: {
|
|
31
|
+
description: "List of API keys retrieved successfully",
|
|
32
|
+
content: { "application/json": { schema: ApiKeyListResponse } }
|
|
33
|
+
},
|
|
34
|
+
...commonGetErrorResponses
|
|
35
|
+
},
|
|
36
|
+
...speakeasyOffsetLimitPagination
|
|
37
|
+
}), async (c) => {
|
|
38
|
+
const { tenantId, projectId } = c.req.valid("param");
|
|
39
|
+
const page = Number(c.req.query("page")) || 1;
|
|
40
|
+
const limit = Math.min(Number(c.req.query("limit")) || 10, 100);
|
|
41
|
+
const agentId = c.req.query("agentId");
|
|
42
|
+
const result = await listApiKeysPaginated(dbClient_default)({
|
|
43
|
+
scopes: {
|
|
44
|
+
tenantId,
|
|
45
|
+
projectId
|
|
46
|
+
},
|
|
47
|
+
pagination: {
|
|
48
|
+
page,
|
|
49
|
+
limit
|
|
50
|
+
},
|
|
51
|
+
agentId
|
|
52
|
+
});
|
|
53
|
+
const sanitizedData = result.data.map(({ keyHash, tenantId: tenantId$1, projectId: projectId$1, ...apiKey }) => apiKey);
|
|
54
|
+
return c.json({
|
|
55
|
+
data: sanitizedData,
|
|
56
|
+
pagination: result.pagination
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
app.openapi(createRoute({
|
|
60
|
+
method: "get",
|
|
61
|
+
path: "/{id}",
|
|
62
|
+
summary: "Get API Key",
|
|
63
|
+
description: "Get a specific API key by ID (does not return the actual key)",
|
|
64
|
+
operationId: "get-api-key-by-id",
|
|
65
|
+
tags: ["API Keys"],
|
|
66
|
+
request: { params: TenantProjectIdParamsSchema },
|
|
67
|
+
responses: {
|
|
68
|
+
200: {
|
|
69
|
+
description: "API key found",
|
|
70
|
+
content: { "application/json": { schema: ApiKeyResponse } }
|
|
71
|
+
},
|
|
72
|
+
...commonGetErrorResponses
|
|
73
|
+
}
|
|
74
|
+
}), async (c) => {
|
|
75
|
+
const { tenantId, projectId, id } = c.req.valid("param");
|
|
76
|
+
const apiKey = await getApiKeyById(dbClient_default)({
|
|
77
|
+
scopes: {
|
|
78
|
+
tenantId,
|
|
79
|
+
projectId
|
|
80
|
+
},
|
|
81
|
+
id
|
|
82
|
+
});
|
|
83
|
+
if (!apiKey || apiKey === void 0) throw createApiError({
|
|
84
|
+
code: "not_found",
|
|
85
|
+
message: "API key not found"
|
|
86
|
+
});
|
|
87
|
+
const { keyHash: _, tenantId: __, projectId: ___, ...sanitizedApiKey } = apiKey;
|
|
88
|
+
return c.json({ data: {
|
|
89
|
+
...sanitizedApiKey,
|
|
90
|
+
lastUsedAt: sanitizedApiKey.lastUsedAt ?? null,
|
|
91
|
+
expiresAt: sanitizedApiKey.expiresAt ?? null
|
|
92
|
+
} });
|
|
93
|
+
});
|
|
94
|
+
app.openapi(createRoute({
|
|
95
|
+
method: "post",
|
|
96
|
+
path: "/",
|
|
97
|
+
summary: "Create API Key",
|
|
98
|
+
description: "Create a new API key for an agent. Returns the full key (shown only once).",
|
|
99
|
+
operationId: "create-api-key",
|
|
100
|
+
tags: ["API Keys"],
|
|
101
|
+
request: {
|
|
102
|
+
params: TenantProjectParamsSchema,
|
|
103
|
+
body: { content: { "application/json": { schema: ApiKeyApiInsertSchema } } }
|
|
104
|
+
},
|
|
105
|
+
responses: {
|
|
106
|
+
201: {
|
|
107
|
+
description: "API key created successfully",
|
|
108
|
+
content: { "application/json": { schema: ApiKeyApiCreationResponseSchema } }
|
|
109
|
+
},
|
|
110
|
+
...commonGetErrorResponses
|
|
111
|
+
}
|
|
112
|
+
}), async (c) => {
|
|
113
|
+
const { tenantId, projectId } = c.req.valid("param");
|
|
114
|
+
const body = c.req.valid("json");
|
|
115
|
+
const { key, ...keyDataWithoutKey } = await generateApiKey();
|
|
116
|
+
const insertData = {
|
|
117
|
+
tenantId,
|
|
118
|
+
projectId,
|
|
119
|
+
name: body.name,
|
|
120
|
+
agentId: body.agentId,
|
|
121
|
+
...keyDataWithoutKey,
|
|
122
|
+
expiresAt: body.expiresAt || void 0
|
|
123
|
+
};
|
|
124
|
+
try {
|
|
125
|
+
const { keyHash: _, tenantId: __, projectId: ___, ...sanitizedApiKey } = await createApiKey(dbClient_default)(insertData);
|
|
126
|
+
return c.json({ data: {
|
|
127
|
+
apiKey: {
|
|
128
|
+
...sanitizedApiKey,
|
|
129
|
+
lastUsedAt: sanitizedApiKey.lastUsedAt ?? null,
|
|
130
|
+
expiresAt: sanitizedApiKey.expiresAt ?? null
|
|
131
|
+
},
|
|
132
|
+
key
|
|
133
|
+
} }, 201);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (error?.cause?.code === "23503") throw createApiError({
|
|
136
|
+
code: "bad_request",
|
|
137
|
+
message: "Invalid agentId - agent does not exist"
|
|
138
|
+
});
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
app.openapi(createRoute({
|
|
143
|
+
method: "put",
|
|
144
|
+
path: "/{id}",
|
|
145
|
+
summary: "Update API Key",
|
|
146
|
+
description: "Update an API key (currently only expiration date can be changed)",
|
|
147
|
+
operationId: "update-api-key",
|
|
148
|
+
tags: ["API Keys"],
|
|
149
|
+
request: {
|
|
150
|
+
params: TenantProjectIdParamsSchema,
|
|
151
|
+
body: { content: { "application/json": { schema: ApiKeyApiUpdateSchema } } }
|
|
152
|
+
},
|
|
153
|
+
responses: {
|
|
154
|
+
200: {
|
|
155
|
+
description: "API key updated successfully",
|
|
156
|
+
content: { "application/json": { schema: ApiKeyResponse } }
|
|
157
|
+
},
|
|
158
|
+
...commonGetErrorResponses
|
|
159
|
+
}
|
|
160
|
+
}), async (c) => {
|
|
161
|
+
const { tenantId, projectId, id } = c.req.valid("param");
|
|
162
|
+
const body = c.req.valid("json");
|
|
163
|
+
const updatedApiKey = await updateApiKey(dbClient_default)({
|
|
164
|
+
scopes: {
|
|
165
|
+
tenantId,
|
|
166
|
+
projectId
|
|
167
|
+
},
|
|
168
|
+
id,
|
|
169
|
+
data: {
|
|
170
|
+
expiresAt: body.expiresAt,
|
|
171
|
+
name: body.name
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
if (!updatedApiKey) throw createApiError({
|
|
175
|
+
code: "not_found",
|
|
176
|
+
message: "API key not found"
|
|
177
|
+
});
|
|
178
|
+
const { keyHash: _, tenantId: __, projectId: ___, ...sanitizedApiKey } = updatedApiKey;
|
|
179
|
+
return c.json({ data: {
|
|
180
|
+
...sanitizedApiKey,
|
|
181
|
+
lastUsedAt: sanitizedApiKey.lastUsedAt ?? null,
|
|
182
|
+
expiresAt: sanitizedApiKey.expiresAt ?? null
|
|
183
|
+
} });
|
|
184
|
+
});
|
|
185
|
+
app.openapi(createRoute({
|
|
186
|
+
method: "delete",
|
|
187
|
+
path: "/{id}",
|
|
188
|
+
summary: "Delete API Key",
|
|
189
|
+
description: "Delete an API key permanently",
|
|
190
|
+
operationId: "delete-api-key",
|
|
191
|
+
tags: ["API Keys"],
|
|
192
|
+
request: { params: TenantProjectIdParamsSchema },
|
|
193
|
+
responses: {
|
|
194
|
+
204: { description: "API key deleted successfully" },
|
|
195
|
+
404: {
|
|
196
|
+
description: "API key not found",
|
|
197
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}), async (c) => {
|
|
201
|
+
const { tenantId, projectId, id } = c.req.valid("param");
|
|
202
|
+
if (!await deleteApiKey(dbClient_default)({
|
|
203
|
+
scopes: {
|
|
204
|
+
tenantId,
|
|
205
|
+
projectId
|
|
206
|
+
},
|
|
207
|
+
id
|
|
208
|
+
})) throw createApiError({
|
|
209
|
+
code: "not_found",
|
|
210
|
+
message: "API key not found"
|
|
211
|
+
});
|
|
212
|
+
return c.body(null, 204);
|
|
213
|
+
});
|
|
214
|
+
var apiKeys_default = app;
|
|
215
|
+
|
|
216
|
+
//#endregion
|
|
217
|
+
export { apiKeys_default as default };
|