mcp-aiven 0.1.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 +201 -0
- package/README.md +173 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +84 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/aiven-api.d.ts +49982 -0
- package/dist/generated/aiven-api.d.ts.map +1 -0
- package/dist/generated/aiven-api.js +6 -0
- package/dist/generated/aiven-api.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/manifests/core.yaml +206 -0
- package/dist/manifests/integrations.yaml +72 -0
- package/dist/manifests/kafka.yaml +143 -0
- package/dist/manifests/pg.yaml +43 -0
- package/dist/prompts.d.ts +5 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +10 -0
- package/dist/prompts.js.map +1 -0
- package/dist/security.d.ts +5 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +52 -0
- package/dist/security.js.map +1 -0
- package/dist/shared/service-info.d.ts +5 -0
- package/dist/shared/service-info.d.ts.map +1 -0
- package/dist/shared/service-info.js +24 -0
- package/dist/shared/service-info.js.map +1 -0
- package/dist/tool-result-limit.d.ts +7 -0
- package/dist/tool-result-limit.d.ts.map +1 -0
- package/dist/tool-result-limit.js +44 -0
- package/dist/tool-result-limit.js.map +1 -0
- package/dist/tools/api-tool.d.ts +4 -0
- package/dist/tools/api-tool.d.ts.map +1 -0
- package/dist/tools/api-tool.js +80 -0
- package/dist/tools/api-tool.js.map +1 -0
- package/dist/tools/applications/handlers.d.ts +4 -0
- package/dist/tools/applications/handlers.d.ts.map +1 -0
- package/dist/tools/applications/handlers.js +345 -0
- package/dist/tools/applications/handlers.js.map +1 -0
- package/dist/tools/applications/index.d.ts +2 -0
- package/dist/tools/applications/index.d.ts.map +1 -0
- package/dist/tools/applications/index.js +2 -0
- package/dist/tools/applications/index.js.map +1 -0
- package/dist/tools/applications/schemas.d.ts +276 -0
- package/dist/tools/applications/schemas.d.ts.map +1 -0
- package/dist/tools/applications/schemas.js +204 -0
- package/dist/tools/applications/schemas.js.map +1 -0
- package/dist/tools/json-schema-to-zod.d.ts +4 -0
- package/dist/tools/json-schema-to-zod.d.ts.map +1 -0
- package/dist/tools/json-schema-to-zod.js +118 -0
- package/dist/tools/json-schema-to-zod.js.map +1 -0
- package/dist/tools/kafka/descriptions.d.ts +3 -0
- package/dist/tools/kafka/descriptions.d.ts.map +1 -0
- package/dist/tools/kafka/descriptions.js +43 -0
- package/dist/tools/kafka/descriptions.js.map +1 -0
- package/dist/tools/kafka/handlers.d.ts +4 -0
- package/dist/tools/kafka/handlers.d.ts.map +1 -0
- package/dist/tools/kafka/handlers.js +65 -0
- package/dist/tools/kafka/handlers.js.map +1 -0
- package/dist/tools/kafka/helpers.d.ts +4 -0
- package/dist/tools/kafka/helpers.d.ts.map +1 -0
- package/dist/tools/kafka/helpers.js +79 -0
- package/dist/tools/kafka/helpers.js.map +1 -0
- package/dist/tools/kafka/index.d.ts +2 -0
- package/dist/tools/kafka/index.d.ts.map +1 -0
- package/dist/tools/kafka/index.js +2 -0
- package/dist/tools/kafka/index.js.map +1 -0
- package/dist/tools/kafka/schemas.d.ts +43 -0
- package/dist/tools/kafka/schemas.d.ts.map +1 -0
- package/dist/tools/kafka/schemas.js +23 -0
- package/dist/tools/kafka/schemas.js.map +1 -0
- package/dist/tools/pg/connection.d.ts +5 -0
- package/dist/tools/pg/connection.d.ts.map +1 -0
- package/dist/tools/pg/connection.js +28 -0
- package/dist/tools/pg/connection.js.map +1 -0
- package/dist/tools/pg/descriptions.d.ts +4 -0
- package/dist/tools/pg/descriptions.d.ts.map +1 -0
- package/dist/tools/pg/descriptions.js +66 -0
- package/dist/tools/pg/descriptions.js.map +1 -0
- package/dist/tools/pg/handlers.d.ts +4 -0
- package/dist/tools/pg/handlers.d.ts.map +1 -0
- package/dist/tools/pg/handlers.js +91 -0
- package/dist/tools/pg/handlers.js.map +1 -0
- package/dist/tools/pg/index.d.ts +2 -0
- package/dist/tools/pg/index.d.ts.map +1 -0
- package/dist/tools/pg/index.js +2 -0
- package/dist/tools/pg/index.js.map +1 -0
- package/dist/tools/pg/query.d.ts +6 -0
- package/dist/tools/pg/query.d.ts.map +1 -0
- package/dist/tools/pg/query.js +120 -0
- package/dist/tools/pg/query.js.map +1 -0
- package/dist/tools/pg/schemas.d.ts +59 -0
- package/dist/tools/pg/schemas.d.ts.map +1 -0
- package/dist/tools/pg/schemas.js +69 -0
- package/dist/tools/pg/schemas.js.map +1 -0
- package/dist/tools/pg/validation.d.ts +10 -0
- package/dist/tools/pg/validation.d.ts.map +1 -0
- package/dist/tools/pg/validation.js +77 -0
- package/dist/tools/pg/validation.js.map +1 -0
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +120 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/response-filter.d.ts +3 -0
- package/dist/tools/response-filter.d.ts.map +1 -0
- package/dist/tools/response-filter.js +19 -0
- package/dist/tools/response-filter.js.map +1 -0
- package/dist/transport.d.ts +14 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +111 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +81 -0
- package/dist/types.js.map +1 -0
- package/generator/schemas/api-schemas.json +2106 -0
- package/package.json +78 -0
- package/src/manifests/core.yaml +206 -0
- package/src/manifests/integrations.yaml +72 -0
- package/src/manifests/kafka.yaml +143 -0
- package/src/manifests/pg.yaml +43 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import express from 'express';
|
|
3
|
+
import rateLimit, { ipKeyGenerator } from 'express-rate-limit';
|
|
4
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
|
+
import { HOST } from './config.js';
|
|
7
|
+
export function createStdioTransport() {
|
|
8
|
+
return new StdioServerTransport();
|
|
9
|
+
}
|
|
10
|
+
const RATE_LIMIT_PROPERTY = 'rateLimit';
|
|
11
|
+
/** Logs and sends the same response as express-rate-limit's default handler. */
|
|
12
|
+
function rateLimitExceededHandler(scope) {
|
|
13
|
+
return (request, response, _next, optionsUsed) => {
|
|
14
|
+
const rl = request[RATE_LIMIT_PROPERTY];
|
|
15
|
+
const ip = request.ip ?? 'unknown';
|
|
16
|
+
const path = request.path || request.url || '';
|
|
17
|
+
console.warn(`mcp-aiven: rate limit exceeded (${scope}) ${request.method} ${path} ip=${ip}` +
|
|
18
|
+
(rl !== undefined ? ` limit=${rl.limit} used=${rl.used} keyPrefix=${rl.key.slice(0, 8)}` : ''));
|
|
19
|
+
response.status(optionsUsed.statusCode);
|
|
20
|
+
const message = optionsUsed.message;
|
|
21
|
+
if (typeof message === 'function') {
|
|
22
|
+
void Promise.resolve(message(request, response)).then((body) => {
|
|
23
|
+
if (!response.writableEnded)
|
|
24
|
+
response.send(body);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else if (!response.writableEnded) {
|
|
28
|
+
response.send(message);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function createMcpPostRateLimit(cfg, message) {
|
|
33
|
+
return rateLimit({
|
|
34
|
+
windowMs: cfg.windowMs,
|
|
35
|
+
limit: cfg.limit,
|
|
36
|
+
standardHeaders: 'draft-7',
|
|
37
|
+
legacyHeaders: false,
|
|
38
|
+
keyGenerator: (req) => mcpRequestKey(req),
|
|
39
|
+
message,
|
|
40
|
+
handler: rateLimitExceededHandler('mcp-post'),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function authMiddleware(req, res, next) {
|
|
44
|
+
const [scheme, token] = (req.headers.authorization ?? '').split(' ', 2);
|
|
45
|
+
if (scheme !== 'Bearer' || !token) {
|
|
46
|
+
res.status(401).json({ error: 'Missing or invalid Authorization header' });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
req.token = token;
|
|
50
|
+
next();
|
|
51
|
+
}
|
|
52
|
+
function mcpRequestKey(req) {
|
|
53
|
+
const auth = req.headers.authorization;
|
|
54
|
+
if (typeof auth === 'string' && auth.startsWith('Bearer ')) {
|
|
55
|
+
const token = auth.slice(7).trim();
|
|
56
|
+
if (token.length > 0) {
|
|
57
|
+
return createHash('sha256').update(token).digest('hex');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return ipKeyGenerator(req.ip ?? '0.0.0.0');
|
|
61
|
+
}
|
|
62
|
+
export function startHttpServer(createServer, config) {
|
|
63
|
+
const app = express();
|
|
64
|
+
if (config.trustProxy) {
|
|
65
|
+
app.set('trust proxy', 1);
|
|
66
|
+
}
|
|
67
|
+
app.use(express.json({ limit: '5mb' }));
|
|
68
|
+
const mcpPostRateLimit = createMcpPostRateLimit(config.rateLimit, {
|
|
69
|
+
error: 'Too many MCP requests. Please wait before trying again.',
|
|
70
|
+
});
|
|
71
|
+
app.get('/health', (_req, res) => {
|
|
72
|
+
res.json({ status: 'ok' });
|
|
73
|
+
});
|
|
74
|
+
app.get('/.well-known/oauth-protected-resource', (_req, res) => {
|
|
75
|
+
res.json({
|
|
76
|
+
resource: HOST,
|
|
77
|
+
authorization_servers: [config.apiOrigin],
|
|
78
|
+
scopes_supported: config.scopes,
|
|
79
|
+
bearer_methods_supported: ['header'],
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
app.get('/mcp', (_req, res) => {
|
|
83
|
+
res.status(405).set('Allow', 'POST').json({ error: 'Method Not Allowed' });
|
|
84
|
+
});
|
|
85
|
+
app.delete('/mcp', (_req, res) => {
|
|
86
|
+
res.status(405).set('Allow', 'POST').json({ error: 'Method Not Allowed' });
|
|
87
|
+
});
|
|
88
|
+
app.post('/mcp', mcpPostRateLimit, authMiddleware, (req, res) => {
|
|
89
|
+
void (async () => {
|
|
90
|
+
const token = req.token;
|
|
91
|
+
const transport = new StreamableHTTPServerTransport({ enableJsonResponse: true });
|
|
92
|
+
const mcpServer = createServer();
|
|
93
|
+
await mcpServer.connect(transport);
|
|
94
|
+
req.auth = {
|
|
95
|
+
token,
|
|
96
|
+
clientId: 'aiven',
|
|
97
|
+
scopes: [],
|
|
98
|
+
};
|
|
99
|
+
await transport.handleRequest(req, res, req.body);
|
|
100
|
+
})().catch((err) => {
|
|
101
|
+
console.error('mcp-aiven: MCP handler error:', err);
|
|
102
|
+
if (!res.headersSent) {
|
|
103
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
app.listen(config.port, () => {
|
|
108
|
+
console.error(`mcp-aiven: HTTP listening on port ${config.port}`);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
export declare enum ServiceCategory {
|
|
4
|
+
Core = "core",
|
|
5
|
+
Pg = "pg",
|
|
6
|
+
Kafka = "kafka",
|
|
7
|
+
Application = "application",
|
|
8
|
+
Integrations = "integrations"
|
|
9
|
+
}
|
|
10
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
11
|
+
export interface AivenConfig {
|
|
12
|
+
readonly token: string | undefined;
|
|
13
|
+
readonly readOnly: boolean;
|
|
14
|
+
readonly transport: 'stdio' | 'http';
|
|
15
|
+
}
|
|
16
|
+
export interface RequestOptions {
|
|
17
|
+
query?: Record<string, string | number | boolean | undefined> | undefined;
|
|
18
|
+
timeout?: number | undefined;
|
|
19
|
+
token?: string | undefined;
|
|
20
|
+
toolName?: string | undefined;
|
|
21
|
+
mcpClient?: string | undefined;
|
|
22
|
+
}
|
|
23
|
+
export interface ToolAnnotations {
|
|
24
|
+
readOnlyHint: boolean;
|
|
25
|
+
destructiveHint: boolean;
|
|
26
|
+
idempotentHint: boolean;
|
|
27
|
+
openWorldHint: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare const READ_ONLY_ANNOTATIONS: ToolAnnotations;
|
|
30
|
+
export declare const CREATE_ANNOTATIONS: ToolAnnotations;
|
|
31
|
+
export declare const UPDATE_ANNOTATIONS: ToolAnnotations;
|
|
32
|
+
export declare const DELETE_ANNOTATIONS: ToolAnnotations;
|
|
33
|
+
export declare const WRITE_DML_ANNOTATIONS: ToolAnnotations;
|
|
34
|
+
export type ToolResult = CallToolResult;
|
|
35
|
+
export interface HandlerContext {
|
|
36
|
+
token?: string | undefined;
|
|
37
|
+
mcpClient?: string | undefined;
|
|
38
|
+
}
|
|
39
|
+
export interface ToolDefinition<TInput extends z.ZodType = z.ZodType> {
|
|
40
|
+
name: string;
|
|
41
|
+
category: ServiceCategory;
|
|
42
|
+
definition: {
|
|
43
|
+
title: string;
|
|
44
|
+
description: string;
|
|
45
|
+
inputSchema: TInput;
|
|
46
|
+
annotations: ToolAnnotations;
|
|
47
|
+
outputSchema?: z.ZodType | undefined;
|
|
48
|
+
};
|
|
49
|
+
handler: (params: z.infer<TInput>, context?: HandlerContext) => Promise<ToolResult>;
|
|
50
|
+
}
|
|
51
|
+
export declare function toolSuccess(data: string | Record<string, unknown>): ToolResult;
|
|
52
|
+
export declare function toolError(message: string): ToolResult;
|
|
53
|
+
export interface JsonSchema {
|
|
54
|
+
type?: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
properties?: Record<string, JsonSchema>;
|
|
57
|
+
required?: string[];
|
|
58
|
+
items?: JsonSchema;
|
|
59
|
+
enum?: string[];
|
|
60
|
+
minimum?: number;
|
|
61
|
+
maximum?: number;
|
|
62
|
+
minLength?: number;
|
|
63
|
+
maxLength?: number;
|
|
64
|
+
pattern?: string;
|
|
65
|
+
default?: unknown;
|
|
66
|
+
nullable?: boolean;
|
|
67
|
+
additionalProperties?: boolean | JsonSchema;
|
|
68
|
+
oneOf?: JsonSchema[];
|
|
69
|
+
anyOf?: JsonSchema[];
|
|
70
|
+
format?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ResponseFilterConfig {
|
|
73
|
+
key: string;
|
|
74
|
+
fields: string[];
|
|
75
|
+
}
|
|
76
|
+
export type ToolSpec = ApiToolConfig;
|
|
77
|
+
export interface ApiToolConfig {
|
|
78
|
+
name: string;
|
|
79
|
+
title: string;
|
|
80
|
+
description: string;
|
|
81
|
+
category: ServiceCategory;
|
|
82
|
+
method: HttpMethod;
|
|
83
|
+
path: string;
|
|
84
|
+
inputSchema: z.ZodType;
|
|
85
|
+
annotations: ToolAnnotations;
|
|
86
|
+
defaults?: Record<string, unknown> | undefined;
|
|
87
|
+
responseFilter?: ResponseFilterConfig | undefined;
|
|
88
|
+
}
|
|
89
|
+
export interface ServiceConnectionInfo {
|
|
90
|
+
host: string;
|
|
91
|
+
port: number;
|
|
92
|
+
user: string;
|
|
93
|
+
password: string;
|
|
94
|
+
dbname: string;
|
|
95
|
+
}
|
|
96
|
+
export declare enum PgToolName {
|
|
97
|
+
OptimizeQuery = "aiven_pg_optimize_query",
|
|
98
|
+
Read = "aiven_pg_read",
|
|
99
|
+
Write = "aiven_pg_write"
|
|
100
|
+
}
|
|
101
|
+
export declare enum PgQueryMode {
|
|
102
|
+
ReadOnly = "read-only",
|
|
103
|
+
ReadWrite = "read-write"
|
|
104
|
+
}
|
|
105
|
+
export interface ExecutePgQueryOptions {
|
|
106
|
+
project: string;
|
|
107
|
+
service_name: string;
|
|
108
|
+
query: string;
|
|
109
|
+
database?: string | undefined;
|
|
110
|
+
mode: PgQueryMode;
|
|
111
|
+
limit?: number | undefined;
|
|
112
|
+
offset?: number | undefined;
|
|
113
|
+
token?: string | undefined;
|
|
114
|
+
mcpClient?: string | undefined;
|
|
115
|
+
toolName?: string | undefined;
|
|
116
|
+
}
|
|
117
|
+
export declare enum ApplicationToolName {
|
|
118
|
+
Deploy = "aiven_application_deploy",
|
|
119
|
+
Redeploy = "aiven_application_redeploy",
|
|
120
|
+
VcsIntegrationList = "aiven_vcs_integration_list",
|
|
121
|
+
VcsIntegrationRepositoryList = "aiven_vcs_integration_repository_list"
|
|
122
|
+
}
|
|
123
|
+
export declare enum KafkaToolName {
|
|
124
|
+
ConnectCreateConnector = "aiven_kafka_connect_create_connector",
|
|
125
|
+
ConnectEditConnector = "aiven_kafka_connect_edit_connector"
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { applyToolResultCharCap } from './tool-result-limit.js';
|
|
2
|
+
export var ServiceCategory;
|
|
3
|
+
(function (ServiceCategory) {
|
|
4
|
+
ServiceCategory["Core"] = "core";
|
|
5
|
+
ServiceCategory["Pg"] = "pg";
|
|
6
|
+
ServiceCategory["Kafka"] = "kafka";
|
|
7
|
+
ServiceCategory["Application"] = "application";
|
|
8
|
+
ServiceCategory["Integrations"] = "integrations";
|
|
9
|
+
})(ServiceCategory || (ServiceCategory = {}));
|
|
10
|
+
export const READ_ONLY_ANNOTATIONS = {
|
|
11
|
+
readOnlyHint: true,
|
|
12
|
+
destructiveHint: false,
|
|
13
|
+
idempotentHint: true,
|
|
14
|
+
openWorldHint: true,
|
|
15
|
+
};
|
|
16
|
+
export const CREATE_ANNOTATIONS = {
|
|
17
|
+
readOnlyHint: false,
|
|
18
|
+
destructiveHint: false,
|
|
19
|
+
idempotentHint: false,
|
|
20
|
+
openWorldHint: true,
|
|
21
|
+
};
|
|
22
|
+
export const UPDATE_ANNOTATIONS = {
|
|
23
|
+
readOnlyHint: false,
|
|
24
|
+
destructiveHint: false,
|
|
25
|
+
idempotentHint: true,
|
|
26
|
+
openWorldHint: true,
|
|
27
|
+
};
|
|
28
|
+
export const DELETE_ANNOTATIONS = {
|
|
29
|
+
readOnlyHint: false,
|
|
30
|
+
destructiveHint: true,
|
|
31
|
+
idempotentHint: true,
|
|
32
|
+
openWorldHint: true,
|
|
33
|
+
};
|
|
34
|
+
export const WRITE_DML_ANNOTATIONS = {
|
|
35
|
+
readOnlyHint: false,
|
|
36
|
+
destructiveHint: true,
|
|
37
|
+
idempotentHint: false,
|
|
38
|
+
openWorldHint: true,
|
|
39
|
+
};
|
|
40
|
+
function textContent(text) {
|
|
41
|
+
return { type: 'text', text };
|
|
42
|
+
}
|
|
43
|
+
export function toolSuccess(data) {
|
|
44
|
+
const text = typeof data === 'string' ? data : JSON.stringify(data);
|
|
45
|
+
const capped = applyToolResultCharCap(text);
|
|
46
|
+
return {
|
|
47
|
+
content: [textContent(capped)],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function toolError(message) {
|
|
51
|
+
return {
|
|
52
|
+
content: [textContent(message)],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export var PgToolName;
|
|
57
|
+
(function (PgToolName) {
|
|
58
|
+
PgToolName["OptimizeQuery"] = "aiven_pg_optimize_query";
|
|
59
|
+
PgToolName["Read"] = "aiven_pg_read";
|
|
60
|
+
PgToolName["Write"] = "aiven_pg_write";
|
|
61
|
+
})(PgToolName || (PgToolName = {}));
|
|
62
|
+
export var PgQueryMode;
|
|
63
|
+
(function (PgQueryMode) {
|
|
64
|
+
PgQueryMode["ReadOnly"] = "read-only";
|
|
65
|
+
PgQueryMode["ReadWrite"] = "read-write";
|
|
66
|
+
})(PgQueryMode || (PgQueryMode = {}));
|
|
67
|
+
// ---------- Application ----------
|
|
68
|
+
export var ApplicationToolName;
|
|
69
|
+
(function (ApplicationToolName) {
|
|
70
|
+
ApplicationToolName["Deploy"] = "aiven_application_deploy";
|
|
71
|
+
ApplicationToolName["Redeploy"] = "aiven_application_redeploy";
|
|
72
|
+
ApplicationToolName["VcsIntegrationList"] = "aiven_vcs_integration_list";
|
|
73
|
+
ApplicationToolName["VcsIntegrationRepositoryList"] = "aiven_vcs_integration_repository_list";
|
|
74
|
+
})(ApplicationToolName || (ApplicationToolName = {}));
|
|
75
|
+
// ---------- Kafka ----------
|
|
76
|
+
export var KafkaToolName;
|
|
77
|
+
(function (KafkaToolName) {
|
|
78
|
+
KafkaToolName["ConnectCreateConnector"] = "aiven_kafka_connect_create_connector";
|
|
79
|
+
KafkaToolName["ConnectEditConnector"] = "aiven_kafka_connect_edit_connector";
|
|
80
|
+
})(KafkaToolName || (KafkaToolName = {}));
|
|
81
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,gCAAa,CAAA;IACb,4BAAS,CAAA;IACT,kCAAe,CAAA;IACf,8CAA2B,CAAA;IAC3B,gDAA6B,CAAA;AAC/B,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAyBD,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IACjD,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IACjD,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IACjD,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,IAAI;CACpB,CAAC;AAsBF,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAsC;IAChE,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO;QACL,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;QACL,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAkDD,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,uDAAyC,CAAA;IACzC,oCAAsB,CAAA;IACtB,sCAAwB,CAAA;AAC1B,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,qCAAsB,CAAA;IACtB,uCAAwB,CAAA;AAC1B,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB;AAeD,oCAAoC;AAEpC,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC7B,0DAAmC,CAAA;IACnC,8DAAuC,CAAA;IACvC,wEAAiD,CAAA;IACjD,6FAAsE,CAAA;AACxE,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAED,8BAA8B;AAE9B,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,gFAA+D,CAAA;IAC/D,4EAA2D,CAAA;AAC7D,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB"}
|