codingbuddy 1.0.0 → 1.1.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/README.md +37 -0
- package/dist/api/mcp.d.ts +2 -0
- package/dist/api/mcp.js +92 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/src/cli/cli.d.ts +1 -0
- package/dist/src/cli/cli.js +15 -0
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/config/config.loader.d.ts +2 -0
- package/dist/src/config/config.loader.js +14 -0
- package/dist/src/config/config.loader.js.map +1 -1
- package/dist/src/main.js +25 -1
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp/mcp-serverless.d.ts +37 -0
- package/dist/src/mcp/mcp-serverless.js +463 -0
- package/dist/src/mcp/mcp-serverless.js.map +1 -0
- package/dist/src/mcp/mcp.service.js +3 -1
- package/dist/src/mcp/mcp.service.js.map +1 -1
- package/dist/src/rules/agent.schema.d.ts +20 -0
- package/dist/src/rules/agent.schema.js +55 -0
- package/dist/src/rules/agent.schema.js.map +1 -0
- package/dist/src/rules/rules.service.js +18 -1
- package/dist/src/rules/rules.service.js.map +1 -1
- package/dist/src/rules/rules.types.d.ts +8 -5
- package/dist/src/rules/skill.schema.d.ts +17 -0
- package/dist/src/rules/skill.schema.js +64 -0
- package/dist/src/rules/skill.schema.js.map +1 -0
- package/dist/src/shared/error.utils.d.ts +1 -0
- package/dist/src/shared/error.utils.js +46 -0
- package/dist/src/shared/error.utils.js.map +1 -0
- package/dist/src/shared/security.utils.d.ts +2 -0
- package/dist/src/shared/security.utils.js +46 -0
- package/dist/src/shared/security.utils.js.map +1 -0
- package/dist/src/shared/validation.constants.d.ts +11 -0
- package/dist/src/shared/validation.constants.js +53 -0
- package/dist/src/shared/validation.constants.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -2
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -23
- package/dist/vitest.config.js.map +0 -1
package/README.md
CHANGED
|
@@ -134,6 +134,43 @@ The server will start in SSE mode, exposing:
|
|
|
134
134
|
- `GET /sse`: SSE Endpoint
|
|
135
135
|
- `POST /messages`: Message Endpoint
|
|
136
136
|
|
|
137
|
+
### Option 5: Vercel Deployment
|
|
138
|
+
|
|
139
|
+
The MCP server can be deployed to Vercel as a serverless function:
|
|
140
|
+
|
|
141
|
+
#### Deploy
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
cd apps/mcp-server
|
|
145
|
+
npx vercel deploy
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### Endpoint
|
|
149
|
+
|
|
150
|
+
- **URL**: `https://your-project.vercel.app/api/mcp`
|
|
151
|
+
- **Method**: POST
|
|
152
|
+
- **Content-Type**: application/json
|
|
153
|
+
|
|
154
|
+
#### Example Request
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
curl -X POST https://your-project.vercel.app/api/mcp \
|
|
158
|
+
-H "Content-Type: application/json" \
|
|
159
|
+
-d '{
|
|
160
|
+
"jsonrpc": "2.0",
|
|
161
|
+
"method": "tools/list",
|
|
162
|
+
"id": 1
|
|
163
|
+
}'
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Transport Modes
|
|
167
|
+
|
|
168
|
+
| Mode | Use Case | Command |
|
|
169
|
+
|------|----------|---------|
|
|
170
|
+
| Stdio | CLI integration | `yarn start` |
|
|
171
|
+
| SSE | Self-hosted HTTP | `MCP_TRANSPORT=sse yarn start` |
|
|
172
|
+
| Vercel | Serverless HTTPS | `npx vercel deploy` |
|
|
173
|
+
|
|
137
174
|
## Environment Variables
|
|
138
175
|
|
|
139
176
|
| Variable | Description | Default |
|
package/dist/api/mcp.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = handler;
|
|
4
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
5
|
+
const mcp_serverless_1 = require("../src/mcp/mcp-serverless");
|
|
6
|
+
const MAX_BODY_SIZE = 1024 * 1024;
|
|
7
|
+
const ALLOWED_METHODS = ['GET', 'POST', 'DELETE', 'OPTIONS'];
|
|
8
|
+
let mcpService = null;
|
|
9
|
+
function getService() {
|
|
10
|
+
if (!mcpService) {
|
|
11
|
+
mcpService = new mcp_serverless_1.McpServerlessService();
|
|
12
|
+
}
|
|
13
|
+
return mcpService;
|
|
14
|
+
}
|
|
15
|
+
function jsonRpcError(res, code, message, status = 500) {
|
|
16
|
+
res.status(status).json({
|
|
17
|
+
jsonrpc: '2.0',
|
|
18
|
+
error: { code, message },
|
|
19
|
+
id: null,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function parseBody(req) {
|
|
23
|
+
if (req.body && typeof req.body === 'object') {
|
|
24
|
+
return req.body;
|
|
25
|
+
}
|
|
26
|
+
const chunks = [];
|
|
27
|
+
let totalSize = 0;
|
|
28
|
+
for await (const chunk of req) {
|
|
29
|
+
totalSize += chunk.length;
|
|
30
|
+
if (totalSize > MAX_BODY_SIZE) {
|
|
31
|
+
throw new Error('PAYLOAD_TOO_LARGE');
|
|
32
|
+
}
|
|
33
|
+
chunks.push(chunk);
|
|
34
|
+
}
|
|
35
|
+
if (chunks.length === 0) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const bodyStr = Buffer.concat(chunks).toString('utf-8');
|
|
39
|
+
return JSON.parse(bodyStr);
|
|
40
|
+
}
|
|
41
|
+
async function handler(req, res) {
|
|
42
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
43
|
+
res.setHeader('Access-Control-Allow-Methods', ALLOWED_METHODS.join(', '));
|
|
44
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id');
|
|
45
|
+
if (req.method === 'OPTIONS') {
|
|
46
|
+
res.status(200).end();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!req.method || !ALLOWED_METHODS.includes(req.method)) {
|
|
50
|
+
return jsonRpcError(res, -32600, 'Method not allowed', 405);
|
|
51
|
+
}
|
|
52
|
+
const contentLength = req.headers['content-length'];
|
|
53
|
+
if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {
|
|
54
|
+
return jsonRpcError(res, -32700, 'Request entity too large', 413);
|
|
55
|
+
}
|
|
56
|
+
if (req.method === 'POST') {
|
|
57
|
+
const contentType = req.headers['content-type'] || '';
|
|
58
|
+
if (!contentType.includes('application/json')) {
|
|
59
|
+
return jsonRpcError(res, -32700, 'Unsupported Media Type: expected application/json', 415);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
let body;
|
|
64
|
+
if (req.method === 'POST') {
|
|
65
|
+
try {
|
|
66
|
+
body = await parseBody(req);
|
|
67
|
+
}
|
|
68
|
+
catch (parseError) {
|
|
69
|
+
if (parseError instanceof Error &&
|
|
70
|
+
parseError.message === 'PAYLOAD_TOO_LARGE') {
|
|
71
|
+
return jsonRpcError(res, -32700, 'Request entity too large', 413);
|
|
72
|
+
}
|
|
73
|
+
console.error('Body parse error:', parseError);
|
|
74
|
+
return jsonRpcError(res, -32700, 'Parse error: invalid JSON', 400);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const service = getService();
|
|
78
|
+
const server = service.getServer();
|
|
79
|
+
const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
80
|
+
sessionIdGenerator: undefined,
|
|
81
|
+
enableJsonResponse: true,
|
|
82
|
+
});
|
|
83
|
+
await server.connect(transport);
|
|
84
|
+
await transport.handleRequest(req, res, body);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error('MCP handler error:', error);
|
|
88
|
+
const message = error instanceof Error ? error.message : 'Internal server error';
|
|
89
|
+
return jsonRpcError(res, -32603, message);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../api/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/cli.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export interface ParsedArgs {
|
|
|
7
7
|
export declare function parseArgs(args: string[]): ParsedArgs;
|
|
8
8
|
export declare function printUsage(): void;
|
|
9
9
|
export declare function printVersion(): void;
|
|
10
|
+
export declare function printApiKeyWarning(): void;
|
|
10
11
|
export declare function main(args?: string[]): Promise<void>;
|
package/dist/src/cli/cli.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.parseArgs = parseArgs;
|
|
5
5
|
exports.printUsage = printUsage;
|
|
6
6
|
exports.printVersion = printVersion;
|
|
7
|
+
exports.printApiKeyWarning = printApiKeyWarning;
|
|
7
8
|
exports.main = main;
|
|
8
9
|
const init_1 = require("./init");
|
|
9
10
|
const main_1 = require("../main");
|
|
@@ -79,8 +80,22 @@ Environment:
|
|
|
79
80
|
function printVersion() {
|
|
80
81
|
process.stdout.write(`codingbuddy v${VERSION}\n`);
|
|
81
82
|
}
|
|
83
|
+
function printApiKeyWarning() {
|
|
84
|
+
const warning = `
|
|
85
|
+
⚠️ Security Warning: API key passed via command line argument.
|
|
86
|
+
This may expose your key in shell history and process lists.
|
|
87
|
+
Consider using the ANTHROPIC_API_KEY environment variable instead:
|
|
88
|
+
|
|
89
|
+
export ANTHROPIC_API_KEY="your-key-here"
|
|
90
|
+
codingbuddy init
|
|
91
|
+
`;
|
|
92
|
+
process.stderr.write(warning);
|
|
93
|
+
}
|
|
82
94
|
async function main(args = process.argv.slice(2)) {
|
|
83
95
|
const { command, options } = parseArgs(args);
|
|
96
|
+
if (options.apiKey) {
|
|
97
|
+
printApiKeyWarning();
|
|
98
|
+
}
|
|
84
99
|
switch (command) {
|
|
85
100
|
case 'help':
|
|
86
101
|
printUsage();
|
package/dist/src/cli/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli/cli.ts"],"names":[],"mappings":";;;AAyBA,8BA+CC;AAKD,gCA6BC;AAKD,oCAEC;AAKD,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,5 +18,7 @@ export declare function validateAndTransform(raw: unknown, filePath: string): {
|
|
|
18
18
|
config: CodingBuddyConfig;
|
|
19
19
|
warnings: string[];
|
|
20
20
|
};
|
|
21
|
+
export declare function isJsConfig(filePath: string): boolean;
|
|
22
|
+
export declare function getJsConfigWarning(filePath: string): string;
|
|
21
23
|
export declare function loadConfig(projectRoot?: string): Promise<ConfigLoadResult>;
|
|
22
24
|
export declare function hasConfigFile(projectRoot: string): boolean;
|
|
@@ -6,6 +6,8 @@ exports.loadJsConfig = loadJsConfig;
|
|
|
6
6
|
exports.loadJsonConfig = loadJsonConfig;
|
|
7
7
|
exports.loadConfigFromFile = loadConfigFromFile;
|
|
8
8
|
exports.validateAndTransform = validateAndTransform;
|
|
9
|
+
exports.isJsConfig = isJsConfig;
|
|
10
|
+
exports.getJsConfigWarning = getJsConfigWarning;
|
|
9
11
|
exports.loadConfig = loadConfig;
|
|
10
12
|
exports.hasConfigFile = hasConfigFile;
|
|
11
13
|
const fs = require("fs/promises");
|
|
@@ -81,6 +83,15 @@ function validateAndTransform(raw, filePath) {
|
|
|
81
83
|
warnings: [],
|
|
82
84
|
};
|
|
83
85
|
}
|
|
86
|
+
function isJsConfig(filePath) {
|
|
87
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
88
|
+
return ext === '.js' || ext === '.mjs';
|
|
89
|
+
}
|
|
90
|
+
function getJsConfigWarning(filePath) {
|
|
91
|
+
return (`Security notice: Loading JavaScript config file (${path.basename(filePath)}). ` +
|
|
92
|
+
'JS configs execute code and may pose security risks in untrusted projects. ' +
|
|
93
|
+
'Consider using codingbuddy.config.json for safer static configuration.');
|
|
94
|
+
}
|
|
84
95
|
async function loadConfig(projectRoot) {
|
|
85
96
|
const root = projectRoot ?? process.cwd();
|
|
86
97
|
const configPath = findConfigFile(root);
|
|
@@ -93,6 +104,9 @@ async function loadConfig(projectRoot) {
|
|
|
93
104
|
}
|
|
94
105
|
const raw = await loadConfigFromFile(configPath);
|
|
95
106
|
const { config, warnings } = validateAndTransform(raw, configPath);
|
|
107
|
+
if (isJsConfig(configPath)) {
|
|
108
|
+
warnings.push(getJsConfigWarning(configPath));
|
|
109
|
+
}
|
|
96
110
|
return {
|
|
97
111
|
config,
|
|
98
112
|
source: configPath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.loader.js","sourceRoot":"","sources":["../../../src/config/config.loader.ts"],"names":[],"mappings":";;;AA4CA,wCAQC;AAKD,oCAeC;AAKD,wCAkBC;AAKD,gDAYC;AAKD,oDAqBC;AAQD,
|
|
1
|
+
{"version":3,"file":"config.loader.js","sourceRoot":"","sources":["../../../src/config/config.loader.ts"],"names":[],"mappings":"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"}
|
package/dist/src/main.js
CHANGED
|
@@ -6,13 +6,37 @@ const core_1 = require("@nestjs/core");
|
|
|
6
6
|
const app_module_1 = require("./app.module");
|
|
7
7
|
const mcp_service_1 = require("./mcp/mcp.service");
|
|
8
8
|
const common_1 = require("@nestjs/common");
|
|
9
|
+
function parseCorsOrigin(corsOrigin) {
|
|
10
|
+
if (!corsOrigin) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (corsOrigin === '*') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (corsOrigin.includes(',')) {
|
|
17
|
+
return corsOrigin.split(',').map(o => o.trim());
|
|
18
|
+
}
|
|
19
|
+
return corsOrigin;
|
|
20
|
+
}
|
|
9
21
|
async function bootstrap() {
|
|
10
22
|
const logger = new common_1.Logger('Bootstrap');
|
|
11
23
|
const transportMode = process.env.MCP_TRANSPORT || 'stdio';
|
|
12
24
|
if (transportMode === 'sse') {
|
|
13
|
-
const
|
|
25
|
+
const corsOrigin = parseCorsOrigin(process.env.CORS_ORIGIN);
|
|
26
|
+
const app = await core_1.NestFactory.create(app_module_1.AppModule, {
|
|
27
|
+
cors: corsOrigin !== false ? { origin: corsOrigin } : false,
|
|
28
|
+
});
|
|
14
29
|
const port = process.env.PORT || 3000;
|
|
15
30
|
await app.listen(port);
|
|
31
|
+
if (corsOrigin === false) {
|
|
32
|
+
logger.warn('SSE mode: CORS disabled (set CORS_ORIGIN to enable)');
|
|
33
|
+
}
|
|
34
|
+
else if (corsOrigin === true) {
|
|
35
|
+
logger.warn('SSE mode: CORS enabled for all origins (*)');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
logger.log(`SSE mode: CORS enabled for: ${JSON.stringify(corsOrigin)}`);
|
|
39
|
+
}
|
|
16
40
|
logger.log(`MCP Server running in SSE mode on port ${port}`);
|
|
17
41
|
}
|
|
18
42
|
else {
|
package/dist/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;;AAgCA,8BA8BC;AA7DD,uCAA2C;AAC3C,6CAAyC;AACzC,mDAA+C;AAC/C,2CAAwC;AAMxC,SAAS,eAAe,CACtB,UAA8B;IAE9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAEhB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAE7B,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAGD,OAAO,UAAU,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC;IAE3D,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAE5B,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,EAAE;YAC9C,IAAI,EAAE,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK;SAC5D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAGvB,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QAEN,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,wBAAwB,CAAC,sBAAS,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,wBAAU,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAGD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Skill } from '../rules/skill.schema';
|
|
3
|
+
interface SkillSummary {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class McpServerlessService {
|
|
8
|
+
private server;
|
|
9
|
+
private rulesDir;
|
|
10
|
+
private projectRoot;
|
|
11
|
+
constructor(rulesDir?: string, projectRoot?: string);
|
|
12
|
+
getServer(): McpServer;
|
|
13
|
+
setRulesDir(rulesDir: string): void;
|
|
14
|
+
setProjectRoot(projectRoot: string): void;
|
|
15
|
+
private findRulesDir;
|
|
16
|
+
private registerTools;
|
|
17
|
+
private registerResources;
|
|
18
|
+
private handleSearchRules;
|
|
19
|
+
private handleGetAgentDetails;
|
|
20
|
+
private handleParseMode;
|
|
21
|
+
private handleGetProjectConfig;
|
|
22
|
+
private handleListSkills;
|
|
23
|
+
private handleGetSkill;
|
|
24
|
+
private handleSuggestConfigUpdates;
|
|
25
|
+
private getRuleContent;
|
|
26
|
+
private listAgents;
|
|
27
|
+
private getAgent;
|
|
28
|
+
private searchRules;
|
|
29
|
+
listSkills(): Promise<SkillSummary[]>;
|
|
30
|
+
getSkill(name: string): Promise<Skill>;
|
|
31
|
+
private parseMode;
|
|
32
|
+
private getRulesForMode;
|
|
33
|
+
private loadProjectSettings;
|
|
34
|
+
private jsonResponse;
|
|
35
|
+
private errorResponse;
|
|
36
|
+
}
|
|
37
|
+
export {};
|