easyeda-mcp-pro 0.2.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 +304 -0
- package/dist/bridge/client.d.ts +16 -0
- package/dist/bridge/client.js +48 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/bridge/extension.d.ts +26 -0
- package/dist/bridge/extension.js +556 -0
- package/dist/bridge/extension.js.map +1 -0
- package/dist/bridge/manager.d.ts +37 -0
- package/dist/bridge/manager.js +225 -0
- package/dist/bridge/manager.js.map +1 -0
- package/dist/bridge/protocol.d.ts +68 -0
- package/dist/bridge/protocol.js +56 -0
- package/dist/bridge/protocol.js.map +1 -0
- package/dist/bridge/types.d.ts +52 -0
- package/dist/bridge/types.js +19 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/config/env.d.ts +98 -0
- package/dist/config/env.js +103 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/feature-flags.d.ts +16 -0
- package/dist/config/feature-flags.js +17 -0
- package/dist/config/feature-flags.js.map +1 -0
- package/dist/config/profiles.d.ts +10 -0
- package/dist/config/profiles.js +45 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +123 -0
- package/dist/schemas/common.js +79 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/server/errors.d.ts +3 -0
- package/dist/server/errors.js +59 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/factory.d.ts +17 -0
- package/dist/server/factory.js +60 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/server/transports/http.d.ts +10 -0
- package/dist/server/transports/http.js +54 -0
- package/dist/server/transports/http.js.map +1 -0
- package/dist/storage/database.d.ts +19 -0
- package/dist/storage/database.js +136 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/types.d.ts +26 -0
- package/dist/storage/types.js +9 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/tools/L0_diagnostics.d.ts +6 -0
- package/dist/tools/L0_diagnostics.js +297 -0
- package/dist/tools/L0_diagnostics.js.map +1 -0
- package/dist/tools/L1_board.d.ts +6 -0
- package/dist/tools/L1_board.js +182 -0
- package/dist/tools/L1_board.js.map +1 -0
- package/dist/tools/L1_bom.d.ts +6 -0
- package/dist/tools/L1_bom.js +267 -0
- package/dist/tools/L1_bom.js.map +1 -0
- package/dist/tools/L1_drc_erc.d.ts +6 -0
- package/dist/tools/L1_drc_erc.js +235 -0
- package/dist/tools/L1_drc_erc.js.map +1 -0
- package/dist/tools/L1_export.d.ts +6 -0
- package/dist/tools/L1_export.js +214 -0
- package/dist/tools/L1_export.js.map +1 -0
- package/dist/tools/L1_schematic.d.ts +6 -0
- package/dist/tools/L1_schematic.js +182 -0
- package/dist/tools/L1_schematic.js.map +1 -0
- package/dist/tools/registry.d.ts +21 -0
- package/dist/tools/registry.js +55 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +53 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.js +54 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/redaction.d.ts +2 -0
- package/dist/utils/redaction.js +56 -0
- package/dist/utils/redaction.js.map +1 -0
- package/dist/vendors/digikey/client.d.ts +49 -0
- package/dist/vendors/digikey/client.js +200 -0
- package/dist/vendors/digikey/client.js.map +1 -0
- package/dist/vendors/jlcpcb/client.d.ts +79 -0
- package/dist/vendors/jlcpcb/client.js +156 -0
- package/dist/vendors/jlcpcb/client.js.map +1 -0
- package/dist/vendors/lcsc/client.d.ts +57 -0
- package/dist/vendors/lcsc/client.js +140 -0
- package/dist/vendors/lcsc/client.js.map +1 -0
- package/dist/vendors/mouser/client.d.ts +46 -0
- package/dist/vendors/mouser/client.js +141 -0
- package/dist/vendors/mouser/client.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type EnvConfig } from './env.js';
|
|
2
|
+
export interface FeatureFlags {
|
|
3
|
+
mcpTasksEnabled: boolean;
|
|
4
|
+
mcpAppsEnabled: boolean;
|
|
5
|
+
mcpV2Experimental: boolean;
|
|
6
|
+
jlcpcbOrderingEnabled: boolean;
|
|
7
|
+
jlcsearchEnabled: boolean;
|
|
8
|
+
mouserEnabled: boolean;
|
|
9
|
+
digikeyEnabled: boolean;
|
|
10
|
+
oauthEnabled: boolean;
|
|
11
|
+
otelEnabled: boolean;
|
|
12
|
+
aiEnabled: boolean;
|
|
13
|
+
devBridge: boolean;
|
|
14
|
+
bridgeRawExecEnabled: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function loadFeatureFlags(config: EnvConfig): FeatureFlags;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function loadFeatureFlags(config) {
|
|
2
|
+
return {
|
|
3
|
+
mcpTasksEnabled: config.MCP_TASKS_ENABLED,
|
|
4
|
+
mcpAppsEnabled: config.MCP_APPS_ENABLED,
|
|
5
|
+
mcpV2Experimental: config.MCP_V2_EXPERIMENTAL,
|
|
6
|
+
jlcpcbOrderingEnabled: config.JLCPCB_ENABLE_ORDERING,
|
|
7
|
+
jlcsearchEnabled: config.JLCSEARCH_ENABLED,
|
|
8
|
+
mouserEnabled: config.MOUSER_ENABLED,
|
|
9
|
+
digikeyEnabled: config.DIGIKEY_ENABLED,
|
|
10
|
+
oauthEnabled: config.OAUTH_ENABLED,
|
|
11
|
+
otelEnabled: config.OTEL_ENABLED,
|
|
12
|
+
aiEnabled: config.AI_PROVIDER !== 'none',
|
|
13
|
+
devBridge: config.EASYEDA_DEV_BRIDGE,
|
|
14
|
+
bridgeRawExecEnabled: config.BRIDGE_RAW_EXEC_ENABLED,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=feature-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../../src/config/feature-flags.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,iBAAiB;QACzC,cAAc,EAAE,MAAM,CAAC,gBAAgB;QACvC,iBAAiB,EAAE,MAAM,CAAC,mBAAmB;QAC7C,qBAAqB,EAAE,MAAM,CAAC,sBAAsB;QACpD,gBAAgB,EAAE,MAAM,CAAC,iBAAiB;QAC1C,aAAa,EAAE,MAAM,CAAC,cAAc;QACpC,cAAc,EAAE,MAAM,CAAC,eAAe;QACtC,YAAY,EAAE,MAAM,CAAC,aAAa;QAClC,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,SAAS,EAAE,MAAM,CAAC,WAAW,KAAK,MAAM;QACxC,SAAS,EAAE,MAAM,CAAC,kBAAkB;QACpC,oBAAoB,EAAE,MAAM,CAAC,uBAAuB;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ToolProfile = 'core' | 'pro' | 'full' | 'dev' | 'experimental';
|
|
2
|
+
export interface ProfileDefinition {
|
|
3
|
+
name: ToolProfile;
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
approxToolCount: string;
|
|
7
|
+
isDefault: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const PROFILE_DEFINITIONS: Record<ToolProfile, ProfileDefinition>;
|
|
10
|
+
export declare function getEnabledProfiles(active: ToolProfile): ToolProfile[];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const PROFILE_DEFINITIONS = {
|
|
2
|
+
core: {
|
|
3
|
+
name: 'core',
|
|
4
|
+
label: 'Core',
|
|
5
|
+
description: 'High-confidence MVP tools: inspect, export, BOM, DRC/ERC, LCSC, snapshots',
|
|
6
|
+
approxToolCount: '35–50',
|
|
7
|
+
isDefault: true,
|
|
8
|
+
},
|
|
9
|
+
pro: {
|
|
10
|
+
name: 'pro',
|
|
11
|
+
label: 'Pro',
|
|
12
|
+
description: 'Workflows: manufacturing pack, sourcing, AI reviews, placement helpers',
|
|
13
|
+
approxToolCount: '80–120',
|
|
14
|
+
isDefault: false,
|
|
15
|
+
},
|
|
16
|
+
full: {
|
|
17
|
+
name: 'full',
|
|
18
|
+
label: 'Full',
|
|
19
|
+
description: 'All validated atomic EasyEDA wrappers',
|
|
20
|
+
approxToolCount: '200+ when validated',
|
|
21
|
+
isDefault: false,
|
|
22
|
+
},
|
|
23
|
+
dev: {
|
|
24
|
+
name: 'dev',
|
|
25
|
+
label: 'Dev',
|
|
26
|
+
description: 'Diagnostics, method probes, raw bridge calls',
|
|
27
|
+
approxToolCount: 'Variable',
|
|
28
|
+
isDefault: false,
|
|
29
|
+
},
|
|
30
|
+
experimental: {
|
|
31
|
+
name: 'experimental',
|
|
32
|
+
label: 'Experimental',
|
|
33
|
+
description: 'MCP Apps, Tasks, simulation, autorouter, AI action plans',
|
|
34
|
+
approxToolCount: 'Variable',
|
|
35
|
+
isDefault: false,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
export function getEnabledProfiles(active) {
|
|
39
|
+
const order = ['core', 'pro', 'full', 'dev', 'experimental'];
|
|
40
|
+
const idx = order.indexOf(active);
|
|
41
|
+
if (idx === -1)
|
|
42
|
+
return ['core'];
|
|
43
|
+
return order.slice(0, idx + 1);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,mBAAmB,GAA2C;IACzE,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,2EAA2E;QACxF,eAAe,EAAE,OAAO;QACxB,SAAS,EAAE,IAAI;KAChB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,wEAAwE;QACrF,eAAe,EAAE,QAAQ;QACzB,SAAS,EAAE,KAAK;KACjB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,uCAAuC;QACpD,eAAe,EAAE,qBAAqB;QACtC,SAAS,EAAE,KAAK;KACjB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,8CAA8C;QAC3D,eAAe,EAAE,UAAU;QAC3B,SAAS,EAAE,KAAK;KACjB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,0DAA0D;QACvE,eAAe,EAAE,UAAU;QAC3B,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,KAAK,GAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { config as loadDotEnv } from 'dotenv';
|
|
3
|
+
loadDotEnv({ quiet: true });
|
|
4
|
+
import { loadEnvConfig } from './config/env.js';
|
|
5
|
+
import { createServer } from './server/factory.js';
|
|
6
|
+
import { registerDiagnostics } from './tools/L0_diagnostics.js';
|
|
7
|
+
import { registerSchematicTools } from './tools/L1_schematic.js';
|
|
8
|
+
import { registerBomTools } from './tools/L1_bom.js';
|
|
9
|
+
import { registerDrcErcTools } from './tools/L1_drc_erc.js';
|
|
10
|
+
import { registerBoardTools } from './tools/L1_board.js';
|
|
11
|
+
import { registerExportTools } from './tools/L1_export.js';
|
|
12
|
+
import { getLogger } from './utils/logger.js';
|
|
13
|
+
import { BridgeManager } from './bridge/manager.js';
|
|
14
|
+
import { createHttpTransport } from './server/transports/http.js';
|
|
15
|
+
async function main() {
|
|
16
|
+
const envConfig = loadEnvConfig();
|
|
17
|
+
const { server, registry, transport, httpTransport, context, storage: _storage, shutdown, } = await createServer(envConfig);
|
|
18
|
+
registerDiagnostics(registry, envConfig);
|
|
19
|
+
registerSchematicTools(registry, envConfig);
|
|
20
|
+
registerBomTools(registry, envConfig);
|
|
21
|
+
registerDrcErcTools(registry, envConfig);
|
|
22
|
+
registerBoardTools(registry, envConfig);
|
|
23
|
+
registerExportTools(registry, envConfig);
|
|
24
|
+
const logger = getLogger();
|
|
25
|
+
registry.registerAllOnServer(server, context);
|
|
26
|
+
const bridgeManager = new BridgeManager(envConfig);
|
|
27
|
+
bridgeManager.on('connected', (hello) => {
|
|
28
|
+
logger.info({ bridgeVersion: hello.bridgeVersion }, 'bridge connected');
|
|
29
|
+
context.bridge.call = async (method, params, opts) => {
|
|
30
|
+
return bridgeManager.call(method, params, opts);
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
bridgeManager.on('error', (err) => {
|
|
34
|
+
logger.error({ err }, 'bridge error');
|
|
35
|
+
});
|
|
36
|
+
process.on('SIGINT', async () => {
|
|
37
|
+
logger.info('received SIGINT');
|
|
38
|
+
bridgeManager.disconnect('SIGINT');
|
|
39
|
+
if (httpTransport)
|
|
40
|
+
await httpTransport.close();
|
|
41
|
+
await shutdown();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
});
|
|
44
|
+
process.on('SIGTERM', async () => {
|
|
45
|
+
logger.info('received SIGTERM');
|
|
46
|
+
bridgeManager.disconnect('SIGTERM');
|
|
47
|
+
if (httpTransport)
|
|
48
|
+
await httpTransport.close();
|
|
49
|
+
await shutdown();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
});
|
|
52
|
+
process.on('uncaughtException', (err) => {
|
|
53
|
+
logger.fatal({ err }, 'uncaught exception');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
});
|
|
56
|
+
process.on('unhandledRejection', (reason) => {
|
|
57
|
+
logger.error({ reason }, 'unhandled rejection');
|
|
58
|
+
});
|
|
59
|
+
if (envConfig.TRANSPORT === 'stdio') {
|
|
60
|
+
logger.info('starting server in stdio mode');
|
|
61
|
+
await server.connect(transport);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
logger.info({ host: envConfig.HTTP_HOST, port: envConfig.HTTP_PORT }, 'starting HTTP transport');
|
|
65
|
+
const http = createHttpTransport(envConfig);
|
|
66
|
+
await server.connect(http.transport);
|
|
67
|
+
await http.start();
|
|
68
|
+
const result = { ...httpTransport, ...http };
|
|
69
|
+
result.shutdown = shutdown;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
main().catch((err) => {
|
|
73
|
+
console.error('Fatal startup error:', err);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const PaginationInput: z.ZodObject<{
|
|
3
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
4
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export declare const PaginationOutput: z.ZodObject<{
|
|
7
|
+
total: z.ZodNumber;
|
|
8
|
+
has_more: z.ZodBoolean;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export declare const ConfirmationInput: z.ZodObject<{
|
|
11
|
+
confirm: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
confirmation_text: z.ZodOptional<z.ZodString>;
|
|
13
|
+
dry_run: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export declare const ErrorCode: z.ZodEnum<{
|
|
16
|
+
EASYEDA_API_ERROR: "EASYEDA_API_ERROR";
|
|
17
|
+
CONFIG_INVALID: "CONFIG_INVALID";
|
|
18
|
+
BRIDGE_NOT_CONNECTED: "BRIDGE_NOT_CONNECTED";
|
|
19
|
+
BRIDGE_TIMEOUT: "BRIDGE_TIMEOUT";
|
|
20
|
+
BRIDGE_METHOD_NOT_AVAILABLE: "BRIDGE_METHOD_NOT_AVAILABLE";
|
|
21
|
+
SCHEMA_VALIDATION_FAILED: "SCHEMA_VALIDATION_FAILED";
|
|
22
|
+
USER_CONFIRMATION_REQUIRED: "USER_CONFIRMATION_REQUIRED";
|
|
23
|
+
FEATURE_DISABLED: "FEATURE_DISABLED";
|
|
24
|
+
PROFILE_NOT_ENABLED: "PROFILE_NOT_ENABLED";
|
|
25
|
+
CREDENTIALS_MISSING: "CREDENTIALS_MISSING";
|
|
26
|
+
VENDOR_API_UNAVAILABLE: "VENDOR_API_UNAVAILABLE";
|
|
27
|
+
RATE_LIMITED: "RATE_LIMITED";
|
|
28
|
+
ARTIFACT_EXPORT_FAILED: "ARTIFACT_EXPORT_FAILED";
|
|
29
|
+
SNAPSHOT_FAILED: "SNAPSHOT_FAILED";
|
|
30
|
+
AI_PROVIDER_DISABLED: "AI_PROVIDER_DISABLED";
|
|
31
|
+
AI_RESPONSE_INVALID: "AI_RESPONSE_INVALID";
|
|
32
|
+
NOT_IMPLEMENTED: "NOT_IMPLEMENTED";
|
|
33
|
+
INTERNAL_ERROR: "INTERNAL_ERROR";
|
|
34
|
+
}>;
|
|
35
|
+
export declare const ActionableError: z.ZodObject<{
|
|
36
|
+
code: z.ZodEnum<{
|
|
37
|
+
EASYEDA_API_ERROR: "EASYEDA_API_ERROR";
|
|
38
|
+
CONFIG_INVALID: "CONFIG_INVALID";
|
|
39
|
+
BRIDGE_NOT_CONNECTED: "BRIDGE_NOT_CONNECTED";
|
|
40
|
+
BRIDGE_TIMEOUT: "BRIDGE_TIMEOUT";
|
|
41
|
+
BRIDGE_METHOD_NOT_AVAILABLE: "BRIDGE_METHOD_NOT_AVAILABLE";
|
|
42
|
+
SCHEMA_VALIDATION_FAILED: "SCHEMA_VALIDATION_FAILED";
|
|
43
|
+
USER_CONFIRMATION_REQUIRED: "USER_CONFIRMATION_REQUIRED";
|
|
44
|
+
FEATURE_DISABLED: "FEATURE_DISABLED";
|
|
45
|
+
PROFILE_NOT_ENABLED: "PROFILE_NOT_ENABLED";
|
|
46
|
+
CREDENTIALS_MISSING: "CREDENTIALS_MISSING";
|
|
47
|
+
VENDOR_API_UNAVAILABLE: "VENDOR_API_UNAVAILABLE";
|
|
48
|
+
RATE_LIMITED: "RATE_LIMITED";
|
|
49
|
+
ARTIFACT_EXPORT_FAILED: "ARTIFACT_EXPORT_FAILED";
|
|
50
|
+
SNAPSHOT_FAILED: "SNAPSHOT_FAILED";
|
|
51
|
+
AI_PROVIDER_DISABLED: "AI_PROVIDER_DISABLED";
|
|
52
|
+
AI_RESPONSE_INVALID: "AI_RESPONSE_INVALID";
|
|
53
|
+
NOT_IMPLEMENTED: "NOT_IMPLEMENTED";
|
|
54
|
+
INTERNAL_ERROR: "INTERNAL_ERROR";
|
|
55
|
+
}>;
|
|
56
|
+
message: z.ZodString;
|
|
57
|
+
suggestion: z.ZodString;
|
|
58
|
+
retryable: z.ZodBoolean;
|
|
59
|
+
details: z.ZodOptional<z.ZodUnknown>;
|
|
60
|
+
correlation_id: z.ZodOptional<z.ZodString>;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
export type EasyEdaMcpErrorCode = z.infer<typeof ErrorCode>;
|
|
63
|
+
export declare class EasyEdaMcpError extends Error {
|
|
64
|
+
readonly code: EasyEdaMcpErrorCode;
|
|
65
|
+
readonly suggestion: string;
|
|
66
|
+
readonly retryable: boolean;
|
|
67
|
+
readonly details: unknown;
|
|
68
|
+
readonly correlation_id: string | undefined;
|
|
69
|
+
constructor(opts: {
|
|
70
|
+
code: EasyEdaMcpErrorCode;
|
|
71
|
+
message: string;
|
|
72
|
+
suggestion: string;
|
|
73
|
+
retryable: boolean;
|
|
74
|
+
details?: unknown;
|
|
75
|
+
correlation_id?: string;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export declare const ToolSource: z.ZodEnum<{
|
|
79
|
+
"official-docs": "official-docs";
|
|
80
|
+
"pro-api-types": "pro-api-types";
|
|
81
|
+
"runtime-probe": "runtime-probe";
|
|
82
|
+
"official-skill": "official-skill";
|
|
83
|
+
"source-format": "source-format";
|
|
84
|
+
"vendor-api-docs": "vendor-api-docs";
|
|
85
|
+
inferred: "inferred";
|
|
86
|
+
}>;
|
|
87
|
+
export type ToolSource = z.infer<typeof ToolSource>;
|
|
88
|
+
export declare const ToolEvidenceMeta: z.ZodObject<{
|
|
89
|
+
profile: z.ZodEnum<{
|
|
90
|
+
core: "core";
|
|
91
|
+
pro: "pro";
|
|
92
|
+
full: "full";
|
|
93
|
+
dev: "dev";
|
|
94
|
+
experimental: "experimental";
|
|
95
|
+
}>;
|
|
96
|
+
status: z.ZodEnum<{
|
|
97
|
+
experimental: "experimental";
|
|
98
|
+
deprecated: "deprecated";
|
|
99
|
+
implemented: "implemented";
|
|
100
|
+
beta: "beta";
|
|
101
|
+
planned: "planned";
|
|
102
|
+
}>;
|
|
103
|
+
evidence: z.ZodArray<z.ZodEnum<{
|
|
104
|
+
"official-docs": "official-docs";
|
|
105
|
+
"pro-api-types": "pro-api-types";
|
|
106
|
+
"runtime-probe": "runtime-probe";
|
|
107
|
+
"official-skill": "official-skill";
|
|
108
|
+
"source-format": "source-format";
|
|
109
|
+
"vendor-api-docs": "vendor-api-docs";
|
|
110
|
+
inferred: "inferred";
|
|
111
|
+
}>>;
|
|
112
|
+
risk: z.ZodEnum<{
|
|
113
|
+
low: "low";
|
|
114
|
+
medium: "medium";
|
|
115
|
+
high: "high";
|
|
116
|
+
}>;
|
|
117
|
+
requiresBridge: z.ZodBoolean;
|
|
118
|
+
requiresNetwork: z.ZodBoolean;
|
|
119
|
+
requiresCredentials: z.ZodBoolean;
|
|
120
|
+
destructive: z.ZodBoolean;
|
|
121
|
+
snapshotRecommended: z.ZodBoolean;
|
|
122
|
+
}, z.core.$strip>;
|
|
123
|
+
export type ToolEvidenceMetaType = z.infer<typeof ToolEvidenceMeta>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const PaginationInput = z.object({
|
|
3
|
+
limit: z.number().int().min(1).max(500).default(100),
|
|
4
|
+
offset: z.number().int().min(0).default(0),
|
|
5
|
+
});
|
|
6
|
+
export const PaginationOutput = z.object({
|
|
7
|
+
total: z.number().int().nonnegative(),
|
|
8
|
+
has_more: z.boolean(),
|
|
9
|
+
});
|
|
10
|
+
export const ConfirmationInput = z.object({
|
|
11
|
+
confirm: z.boolean().default(false),
|
|
12
|
+
confirmation_text: z.string().optional(),
|
|
13
|
+
dry_run: z.boolean().default(true),
|
|
14
|
+
});
|
|
15
|
+
export const ErrorCode = z.enum([
|
|
16
|
+
'CONFIG_INVALID',
|
|
17
|
+
'BRIDGE_NOT_CONNECTED',
|
|
18
|
+
'BRIDGE_TIMEOUT',
|
|
19
|
+
'BRIDGE_METHOD_NOT_AVAILABLE',
|
|
20
|
+
'EASYEDA_API_ERROR',
|
|
21
|
+
'SCHEMA_VALIDATION_FAILED',
|
|
22
|
+
'USER_CONFIRMATION_REQUIRED',
|
|
23
|
+
'FEATURE_DISABLED',
|
|
24
|
+
'PROFILE_NOT_ENABLED',
|
|
25
|
+
'CREDENTIALS_MISSING',
|
|
26
|
+
'VENDOR_API_UNAVAILABLE',
|
|
27
|
+
'RATE_LIMITED',
|
|
28
|
+
'ARTIFACT_EXPORT_FAILED',
|
|
29
|
+
'SNAPSHOT_FAILED',
|
|
30
|
+
'AI_PROVIDER_DISABLED',
|
|
31
|
+
'AI_RESPONSE_INVALID',
|
|
32
|
+
'NOT_IMPLEMENTED',
|
|
33
|
+
'INTERNAL_ERROR',
|
|
34
|
+
]);
|
|
35
|
+
export const ActionableError = z.object({
|
|
36
|
+
code: ErrorCode,
|
|
37
|
+
message: z.string(),
|
|
38
|
+
suggestion: z.string(),
|
|
39
|
+
retryable: z.boolean(),
|
|
40
|
+
details: z.unknown().optional(),
|
|
41
|
+
correlation_id: z.string().optional(),
|
|
42
|
+
});
|
|
43
|
+
export class EasyEdaMcpError extends Error {
|
|
44
|
+
code;
|
|
45
|
+
suggestion;
|
|
46
|
+
retryable;
|
|
47
|
+
details;
|
|
48
|
+
correlation_id;
|
|
49
|
+
constructor(opts) {
|
|
50
|
+
super(opts.message);
|
|
51
|
+
this.name = 'EasyEdaMcpError';
|
|
52
|
+
this.code = opts.code;
|
|
53
|
+
this.suggestion = opts.suggestion;
|
|
54
|
+
this.retryable = opts.retryable;
|
|
55
|
+
this.details = opts.details;
|
|
56
|
+
this.correlation_id = opts.correlation_id;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export const ToolSource = z.enum([
|
|
60
|
+
'official-docs',
|
|
61
|
+
'pro-api-types',
|
|
62
|
+
'runtime-probe',
|
|
63
|
+
'official-skill',
|
|
64
|
+
'source-format',
|
|
65
|
+
'vendor-api-docs',
|
|
66
|
+
'inferred',
|
|
67
|
+
]);
|
|
68
|
+
export const ToolEvidenceMeta = z.object({
|
|
69
|
+
profile: z.enum(['core', 'pro', 'full', 'dev', 'experimental']),
|
|
70
|
+
status: z.enum(['implemented', 'beta', 'experimental', 'planned', 'deprecated']),
|
|
71
|
+
evidence: z.array(ToolSource),
|
|
72
|
+
risk: z.enum(['low', 'medium', 'high']),
|
|
73
|
+
requiresBridge: z.boolean(),
|
|
74
|
+
requiresNetwork: z.boolean(),
|
|
75
|
+
requiresCredentials: z.boolean(),
|
|
76
|
+
destructive: z.boolean(),
|
|
77
|
+
snapshotRecommended: z.boolean(),
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export function toMcpError(code, message, suggestion) {
|
|
3
|
+
const mcpCode = mapToMcpCode(code);
|
|
4
|
+
const errorData = {
|
|
5
|
+
code,
|
|
6
|
+
message,
|
|
7
|
+
suggestion,
|
|
8
|
+
retryable: isRetryable(code),
|
|
9
|
+
};
|
|
10
|
+
return new McpError(mcpCode, JSON.stringify(errorData));
|
|
11
|
+
}
|
|
12
|
+
function mapToMcpCode(code) {
|
|
13
|
+
switch (code) {
|
|
14
|
+
case 'CONFIG_INVALID':
|
|
15
|
+
return -32600;
|
|
16
|
+
case 'BRIDGE_NOT_CONNECTED':
|
|
17
|
+
case 'BRIDGE_TIMEOUT':
|
|
18
|
+
return -32000;
|
|
19
|
+
case 'BRIDGE_METHOD_NOT_AVAILABLE':
|
|
20
|
+
return -32601;
|
|
21
|
+
case 'SCHEMA_VALIDATION_FAILED':
|
|
22
|
+
return -32602;
|
|
23
|
+
case 'USER_CONFIRMATION_REQUIRED':
|
|
24
|
+
return -32001;
|
|
25
|
+
case 'FEATURE_DISABLED':
|
|
26
|
+
case 'PROFILE_NOT_ENABLED':
|
|
27
|
+
return -32002;
|
|
28
|
+
case 'CREDENTIALS_MISSING':
|
|
29
|
+
return -32003;
|
|
30
|
+
case 'VENDOR_API_UNAVAILABLE':
|
|
31
|
+
return -32004;
|
|
32
|
+
case 'RATE_LIMITED':
|
|
33
|
+
return -32005;
|
|
34
|
+
case 'EASYEDA_API_ERROR':
|
|
35
|
+
case 'ARTIFACT_EXPORT_FAILED':
|
|
36
|
+
case 'SNAPSHOT_FAILED':
|
|
37
|
+
return -32006;
|
|
38
|
+
case 'AI_PROVIDER_DISABLED':
|
|
39
|
+
case 'AI_RESPONSE_INVALID':
|
|
40
|
+
return -32007;
|
|
41
|
+
case 'NOT_IMPLEMENTED':
|
|
42
|
+
return -32604;
|
|
43
|
+
case 'INTERNAL_ERROR':
|
|
44
|
+
default:
|
|
45
|
+
return -32603;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isRetryable(code) {
|
|
49
|
+
switch (code) {
|
|
50
|
+
case 'BRIDGE_TIMEOUT':
|
|
51
|
+
case 'VENDOR_API_UNAVAILABLE':
|
|
52
|
+
case 'RATE_LIMITED':
|
|
53
|
+
case 'EASYEDA_API_ERROR':
|
|
54
|
+
return true;
|
|
55
|
+
default:
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAkB,MAAM,oCAAoC,CAAC;AAE9E,MAAM,UAAU,UAAU,CACxB,IAAyB,EACzB,OAAe,EACf,UAAkB;IAElB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,OAAO;QACP,UAAU;QACV,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;KAC7B,CAAC;IAEF,OAAO,IAAI,QAAQ,CAAC,OAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,YAAY,CAAC,IAAyB;IAC7C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB;YACnB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,gBAAgB;YACnB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,6BAA6B;YAChC,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,0BAA0B;YAC7B,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,4BAA4B;YAC/B,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,kBAAkB,CAAC;QACxB,KAAK,qBAAqB;YACxB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,qBAAqB;YACxB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,wBAAwB;YAC3B,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,mBAAmB,CAAC;QACzB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,iBAAiB;YACpB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,qBAAqB;YACxB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,iBAAiB;YACpB,OAAO,CAAC,KAAK,CAAC;QAChB,KAAK,gBAAgB,CAAC;QACtB;YACE,OAAO,CAAC,KAAK,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAyB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB,CAAC;QACtB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,cAAc,CAAC;QACpB,KAAK,mBAAmB;YACtB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { type EnvConfig } from '../config/env.js';
|
|
4
|
+
import { ToolRegistry } from '../tools/registry.js';
|
|
5
|
+
import { type ToolContext } from '../tools/types.js';
|
|
6
|
+
import { Storage } from '../storage/index.js';
|
|
7
|
+
import { type HttpTransportInstance } from './transports/http.js';
|
|
8
|
+
export interface McpServerInstance {
|
|
9
|
+
server: Server;
|
|
10
|
+
registry: ToolRegistry;
|
|
11
|
+
transport: StdioServerTransport;
|
|
12
|
+
httpTransport?: HttpTransportInstance;
|
|
13
|
+
context: ToolContext;
|
|
14
|
+
storage?: Storage;
|
|
15
|
+
shutdown: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createServer(config: EnvConfig): Promise<McpServerInstance>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { createLogger } from '../utils/logger.js';
|
|
5
|
+
import { ToolRegistry } from '../tools/registry.js';
|
|
6
|
+
import { redactObject } from '../utils/redaction.js';
|
|
7
|
+
import { loadFeatureFlags } from '../config/feature-flags.js';
|
|
8
|
+
import { Storage } from '../storage/index.js';
|
|
9
|
+
export async function createServer(config) {
|
|
10
|
+
const logger = createLogger(config);
|
|
11
|
+
const flags = loadFeatureFlags(config);
|
|
12
|
+
logger.info({
|
|
13
|
+
profile: config.TOOL_PROFILE,
|
|
14
|
+
transport: config.TRANSPORT,
|
|
15
|
+
nodeVersion: process.version,
|
|
16
|
+
flags: redactObject(flags),
|
|
17
|
+
}, 'server initializing');
|
|
18
|
+
const server = new Server({
|
|
19
|
+
name: 'easyeda-mcp-pro',
|
|
20
|
+
version: '0.2.0',
|
|
21
|
+
}, {
|
|
22
|
+
capabilities: {
|
|
23
|
+
tools: {},
|
|
24
|
+
resources: {},
|
|
25
|
+
prompts: {},
|
|
26
|
+
...(flags.mcpTasksEnabled ? {} : undefined),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
const registry = new ToolRegistry();
|
|
30
|
+
registry.setProfile(config.TOOL_PROFILE);
|
|
31
|
+
const context = {
|
|
32
|
+
profile: config.TOOL_PROFILE,
|
|
33
|
+
bridge: {
|
|
34
|
+
call: async (method, _params, _opts) => {
|
|
35
|
+
logger.info({ method }, 'bridge call');
|
|
36
|
+
throw new Error(`Bridge not connected: ${method}`);
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
config: {
|
|
40
|
+
bridgeTimeoutMs: config.BRIDGE_TIMEOUT_MS,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
44
|
+
const tools = registry.getToolDefinitions();
|
|
45
|
+
return { tools };
|
|
46
|
+
});
|
|
47
|
+
server.onerror = (error) => {
|
|
48
|
+
logger.error({ err: error }, 'server error');
|
|
49
|
+
};
|
|
50
|
+
const storage = new Storage(config);
|
|
51
|
+
storage.initialize();
|
|
52
|
+
const transport = new StdioServerTransport();
|
|
53
|
+
const shutdown = async () => {
|
|
54
|
+
logger.info('server shutting down');
|
|
55
|
+
storage.close();
|
|
56
|
+
await server.close();
|
|
57
|
+
};
|
|
58
|
+
return { server, registry, transport, context, storage, shutdown };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/server/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Express } from 'express';
|
|
2
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
|
+
import { type EnvConfig } from '../../config/env.js';
|
|
4
|
+
export interface HttpTransportInstance {
|
|
5
|
+
app: Express;
|
|
6
|
+
transport: StreamableHTTPServerTransport;
|
|
7
|
+
start: () => Promise<void>;
|
|
8
|
+
close: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare function createHttpTransport(config: EnvConfig): HttpTransportInstance;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
|
|
3
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
|
+
import { getLogger } from '../../utils/logger.js';
|
|
5
|
+
export function createHttpTransport(config) {
|
|
6
|
+
const logger = getLogger();
|
|
7
|
+
const transport = new StreamableHTTPServerTransport({
|
|
8
|
+
sessionIdGenerator: () => randomUUID(),
|
|
9
|
+
});
|
|
10
|
+
const app = createMcpExpressApp({ host: config.HTTP_HOST });
|
|
11
|
+
if (config.CORS_ORIGIN) {
|
|
12
|
+
app.use((req, res, next) => {
|
|
13
|
+
res.setHeader('Access-Control-Allow-Origin', config.CORS_ORIGIN);
|
|
14
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
15
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
16
|
+
if (req.method === 'OPTIONS') {
|
|
17
|
+
res.status(204).end();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
next();
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
app.post('/mcp', (req, res) => {
|
|
24
|
+
transport.handleRequest(req, res, req.body);
|
|
25
|
+
});
|
|
26
|
+
app.get('/mcp', (req, res) => {
|
|
27
|
+
transport.handleRequest(req, res);
|
|
28
|
+
});
|
|
29
|
+
app.get('/healthz', (_req, res) => {
|
|
30
|
+
res.json({ status: 'ok', version: '0.2.0' });
|
|
31
|
+
});
|
|
32
|
+
app.get('/readyz', (_req, res) => {
|
|
33
|
+
res.json({ status: 'ok', uptime: process.uptime() });
|
|
34
|
+
});
|
|
35
|
+
let server;
|
|
36
|
+
const start = async () => {
|
|
37
|
+
return new Promise((resolve) => {
|
|
38
|
+
server = app.listen(config.HTTP_PORT, config.HTTP_HOST, () => {
|
|
39
|
+
logger.info({ host: config.HTTP_HOST, port: config.HTTP_PORT }, 'HTTP transport listening');
|
|
40
|
+
resolve();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const close = async () => {
|
|
45
|
+
logger.info('HTTP transport closing');
|
|
46
|
+
await transport.close();
|
|
47
|
+
const s = server;
|
|
48
|
+
if (s) {
|
|
49
|
+
await new Promise((resolve) => s.close(() => resolve()));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return { app, transport, start, close };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/server/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type EnvConfig } from '../config/env.js';
|
|
2
|
+
import { type ProjectCache, type ArtifactRecord } from './types.js';
|
|
3
|
+
export declare class Storage {
|
|
4
|
+
private db;
|
|
5
|
+
private config;
|
|
6
|
+
private initialized;
|
|
7
|
+
constructor(config: EnvConfig);
|
|
8
|
+
initialize(): void;
|
|
9
|
+
cacheGet(key: string): string | null;
|
|
10
|
+
cacheSet(key: string, value: string, ttlSec?: number): void;
|
|
11
|
+
cacheDelete(key: string): void;
|
|
12
|
+
cacheClear(): void;
|
|
13
|
+
getProjectCache(hash: string): ProjectCache | null;
|
|
14
|
+
upsertProjectCache(cache: ProjectCache): void;
|
|
15
|
+
insertArtifact(artifact: ArtifactRecord): void;
|
|
16
|
+
getArtifacts(projectHash: string, type?: string): ArtifactRecord[];
|
|
17
|
+
vacuum(): void;
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|