skedyul 1.2.19 → 1.2.21
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/cli/index.js +50 -102
- package/dist/config/app-config.d.ts +26 -2
- package/dist/config/index.d.ts +1 -2
- package/dist/dedicated/server.js +42 -90
- package/dist/esm/index.mjs +42 -92
- package/dist/index.d.ts +1 -1
- package/dist/index.js +42 -94
- package/dist/server/config-serializer.d.ts +12 -0
- package/dist/server/dedicated.d.ts +3 -2
- package/dist/server/index.d.ts +15 -6
- package/dist/server/serverless.d.ts +3 -2
- package/dist/server/startup-logger.d.ts +3 -2
- package/dist/server/utils/http.d.ts +3 -2
- package/dist/server.d.ts +1 -1
- package/dist/server.js +42 -90
- package/dist/serverless/server.mjs +42 -90
- package/dist/types/index.d.ts +1 -1
- package/dist/types/server.d.ts +0 -33
- package/package.json +1 -1
- package/dist/config/resolve.d.ts +0 -27
package/dist/cli/index.js
CHANGED
|
@@ -2891,10 +2891,11 @@ function padEnd(str, length) {
|
|
|
2891
2891
|
}
|
|
2892
2892
|
return str + " ".repeat(length - str.length);
|
|
2893
2893
|
}
|
|
2894
|
-
function printStartupLog(config, tools,
|
|
2894
|
+
function printStartupLog(config, tools, port) {
|
|
2895
2895
|
if (process.env.NODE_ENV === "test") {
|
|
2896
2896
|
return;
|
|
2897
2897
|
}
|
|
2898
|
+
const webhookRegistry = config.webhooks;
|
|
2898
2899
|
const webhookCount = webhookRegistry ? Object.keys(webhookRegistry).length : 0;
|
|
2899
2900
|
const webhookNames = webhookRegistry ? Object.keys(webhookRegistry) : [];
|
|
2900
2901
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
@@ -2907,9 +2908,9 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
2907
2908
|
console.log(`\u2551 \u{1F680} Skedyul MCP Server Starting \u2551`);
|
|
2908
2909
|
console.log(`\u2560${divider}\u2563`);
|
|
2909
2910
|
console.log(`\u2551 \u2551`);
|
|
2910
|
-
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.
|
|
2911
|
-
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.
|
|
2912
|
-
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer, 49)}\u2551`);
|
|
2911
|
+
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.name, 49)}\u2551`);
|
|
2912
|
+
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.version ?? "N/A", 49)}\u2551`);
|
|
2913
|
+
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer ?? "serverless", 49)}\u2551`);
|
|
2913
2914
|
if (port) {
|
|
2914
2915
|
console.log(`\u2551 \u{1F310} Port: ${padEnd(String(port), 49)}\u2551`);
|
|
2915
2916
|
}
|
|
@@ -2951,67 +2952,40 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
2951
2952
|
console.log("");
|
|
2952
2953
|
}
|
|
2953
2954
|
|
|
2954
|
-
// src/config
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
}
|
|
2959
|
-
if (value instanceof Promise) {
|
|
2960
|
-
const resolved = await value;
|
|
2961
|
-
if (resolved && typeof resolved === "object" && "default" in resolved) {
|
|
2962
|
-
return resolved.default;
|
|
2963
|
-
}
|
|
2964
|
-
return resolved;
|
|
2965
|
-
}
|
|
2966
|
-
return value;
|
|
2967
|
-
}
|
|
2968
|
-
function serializeTools(registry) {
|
|
2969
|
-
return Object.entries(registry).map(([key, tool]) => ({
|
|
2970
|
-
name: tool.name || key,
|
|
2971
|
-
displayName: tool.label,
|
|
2972
|
-
description: tool.description,
|
|
2973
|
-
timeout: tool.timeout,
|
|
2974
|
-
retries: tool.retries
|
|
2975
|
-
}));
|
|
2976
|
-
}
|
|
2977
|
-
function serializeWebhooks(registry) {
|
|
2978
|
-
return Object.values(registry).map((webhook) => ({
|
|
2979
|
-
name: webhook.name,
|
|
2980
|
-
description: webhook.description,
|
|
2981
|
-
methods: webhook.methods ?? ["POST"],
|
|
2982
|
-
type: webhook.type ?? "WEBHOOK"
|
|
2983
|
-
}));
|
|
2984
|
-
}
|
|
2985
|
-
async function resolveConfig(config, registry, webhookRegistry) {
|
|
2986
|
-
const provision = await resolveDynamicImport(
|
|
2987
|
-
config.provision
|
|
2988
|
-
);
|
|
2989
|
-
const install = await resolveDynamicImport(
|
|
2990
|
-
config.install
|
|
2991
|
-
);
|
|
2992
|
-
const tools = serializeTools(registry);
|
|
2993
|
-
const webhooks = webhookRegistry ? serializeWebhooks(webhookRegistry) : [];
|
|
2955
|
+
// src/server/config-serializer.ts
|
|
2956
|
+
function serializeConfig(config) {
|
|
2957
|
+
const registry = config.tools;
|
|
2958
|
+
const webhookRegistry = config.webhooks;
|
|
2994
2959
|
return {
|
|
2995
2960
|
name: config.name,
|
|
2996
2961
|
version: config.version,
|
|
2997
2962
|
description: config.description,
|
|
2998
2963
|
computeLayer: config.computeLayer,
|
|
2999
|
-
tools,
|
|
3000
|
-
|
|
3001
|
-
|
|
2964
|
+
tools: registry ? Object.entries(registry).map(([key, tool]) => ({
|
|
2965
|
+
name: tool.name || key,
|
|
2966
|
+
description: tool.description,
|
|
2967
|
+
timeout: tool.timeout,
|
|
2968
|
+
retries: tool.retries
|
|
2969
|
+
})) : [],
|
|
2970
|
+
webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
|
|
2971
|
+
name: w.name,
|
|
2972
|
+
description: w.description,
|
|
2973
|
+
methods: w.methods ?? ["POST"],
|
|
2974
|
+
type: w.type ?? "WEBHOOK"
|
|
2975
|
+
})) : [],
|
|
2976
|
+
provision: isProvisionConfig(config.provision) ? config.provision : void 0,
|
|
3002
2977
|
agents: config.agents
|
|
3003
2978
|
};
|
|
3004
2979
|
}
|
|
3005
|
-
function
|
|
3006
|
-
return
|
|
3007
|
-
name,
|
|
3008
|
-
version
|
|
3009
|
-
};
|
|
2980
|
+
function isProvisionConfig(value) {
|
|
2981
|
+
return value !== void 0 && value !== null && !(value instanceof Promise);
|
|
3010
2982
|
}
|
|
3011
2983
|
|
|
3012
2984
|
// src/server/dedicated.ts
|
|
3013
|
-
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
2985
|
+
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer) {
|
|
3014
2986
|
const port = getListeningPort(config);
|
|
2987
|
+
const registry = config.tools;
|
|
2988
|
+
const webhookRegistry = config.webhooks;
|
|
3015
2989
|
const httpServer = import_http2.default.createServer(
|
|
3016
2990
|
async (req, res) => {
|
|
3017
2991
|
function sendCoreResult(result) {
|
|
@@ -3028,19 +3002,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3028
3002
|
return;
|
|
3029
3003
|
}
|
|
3030
3004
|
if (pathname === "/config" && req.method === "GET") {
|
|
3031
|
-
|
|
3032
|
-
if (!appConfig && config.appConfigLoader) {
|
|
3033
|
-
const loaded = await config.appConfigLoader();
|
|
3034
|
-
appConfig = loaded.default;
|
|
3035
|
-
}
|
|
3036
|
-
if (!appConfig) {
|
|
3037
|
-
appConfig = createMinimalConfig(
|
|
3038
|
-
config.metadata.name,
|
|
3039
|
-
config.metadata.version
|
|
3040
|
-
);
|
|
3041
|
-
}
|
|
3042
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
3043
|
-
sendJSON(res, 200, serializedConfig);
|
|
3005
|
+
sendJSON(res, 200, serializeConfig(config));
|
|
3044
3006
|
return;
|
|
3045
3007
|
}
|
|
3046
3008
|
if (pathname.startsWith("/webhooks/") && webhookRegistry) {
|
|
@@ -3569,7 +3531,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3569
3531
|
const finalPort = listenPort ?? port;
|
|
3570
3532
|
return new Promise((resolve8, reject) => {
|
|
3571
3533
|
httpServer.listen(finalPort, () => {
|
|
3572
|
-
printStartupLog(config, tools,
|
|
3534
|
+
printStartupLog(config, tools, finalPort);
|
|
3573
3535
|
resolve8();
|
|
3574
3536
|
});
|
|
3575
3537
|
httpServer.once("error", reject);
|
|
@@ -3580,13 +3542,15 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3580
3542
|
}
|
|
3581
3543
|
|
|
3582
3544
|
// src/server/serverless.ts
|
|
3583
|
-
function createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3545
|
+
function createServerlessInstance(config, tools, callTool, state, mcpServer) {
|
|
3584
3546
|
const headers = getDefaultHeaders(config.cors);
|
|
3547
|
+
const registry = config.tools;
|
|
3548
|
+
const webhookRegistry = config.webhooks;
|
|
3585
3549
|
let hasLoggedStartup = false;
|
|
3586
3550
|
return {
|
|
3587
3551
|
async handler(event) {
|
|
3588
3552
|
if (!hasLoggedStartup) {
|
|
3589
|
-
printStartupLog(config, tools
|
|
3553
|
+
printStartupLog(config, tools);
|
|
3590
3554
|
hasLoggedStartup = true;
|
|
3591
3555
|
}
|
|
3592
3556
|
try {
|
|
@@ -4131,19 +4095,7 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
|
|
|
4131
4095
|
return createResponse(200, state.getHealthStatus(), headers);
|
|
4132
4096
|
}
|
|
4133
4097
|
if (path14 === "/config" && method === "GET") {
|
|
4134
|
-
|
|
4135
|
-
if (!appConfig && config.appConfigLoader) {
|
|
4136
|
-
const loaded = await config.appConfigLoader();
|
|
4137
|
-
appConfig = loaded.default;
|
|
4138
|
-
}
|
|
4139
|
-
if (!appConfig) {
|
|
4140
|
-
appConfig = createMinimalConfig(
|
|
4141
|
-
config.metadata.name,
|
|
4142
|
-
config.metadata.version
|
|
4143
|
-
);
|
|
4144
|
-
}
|
|
4145
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
4146
|
-
return createResponse(200, serializedConfig, headers);
|
|
4098
|
+
return createResponse(200, serializeConfig(config), headers);
|
|
4147
4099
|
}
|
|
4148
4100
|
if (path14 === "/mcp" && method === "POST") {
|
|
4149
4101
|
let body;
|
|
@@ -4361,9 +4313,11 @@ console.log("[skedyul-node/server] All imports complete");
|
|
|
4361
4313
|
console.log("[skedyul-node/server] Installing context logger...");
|
|
4362
4314
|
installContextLogger();
|
|
4363
4315
|
console.log("[skedyul-node/server] Context logger installed");
|
|
4364
|
-
function createSkedyulServer(config
|
|
4316
|
+
function createSkedyulServer(config) {
|
|
4365
4317
|
console.log("[createSkedyulServer] Step 1: mergeRuntimeEnv()");
|
|
4366
4318
|
mergeRuntimeEnv();
|
|
4319
|
+
const registry = config.tools;
|
|
4320
|
+
const webhookRegistry = config.webhooks;
|
|
4367
4321
|
console.log("[createSkedyulServer] Step 2: coreApi setup");
|
|
4368
4322
|
if (config.coreApi?.service) {
|
|
4369
4323
|
coreApiService.register(config.coreApi.service);
|
|
@@ -4375,7 +4329,7 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4375
4329
|
const tools = buildToolMetadata(registry);
|
|
4376
4330
|
console.log("[createSkedyulServer] Step 3 done, tools:", tools.length);
|
|
4377
4331
|
const toolNames = Object.values(registry).map((tool) => tool.name);
|
|
4378
|
-
const runtimeLabel = config.computeLayer;
|
|
4332
|
+
const runtimeLabel = config.computeLayer ?? "serverless";
|
|
4379
4333
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
4380
4334
|
const ttlExtendSeconds = config.ttlExtendSeconds ?? parseNumberEnv(process.env.MCP_TTL_EXTEND) ?? 3600;
|
|
4381
4335
|
console.log("[createSkedyulServer] Step 4: createRequestState()");
|
|
@@ -4388,8 +4342,8 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4388
4342
|
console.log("[createSkedyulServer] Step 4 done");
|
|
4389
4343
|
console.log("[createSkedyulServer] Step 5: new McpServer()");
|
|
4390
4344
|
const mcpServer = new import_mcp.McpServer({
|
|
4391
|
-
name: config.
|
|
4392
|
-
version: config.
|
|
4345
|
+
name: config.name,
|
|
4346
|
+
version: config.version ?? "0.0.0"
|
|
4393
4347
|
});
|
|
4394
4348
|
console.log("[createSkedyulServer] Step 5 done");
|
|
4395
4349
|
const dedicatedShutdown = () => {
|
|
@@ -4517,13 +4471,11 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4517
4471
|
tools,
|
|
4518
4472
|
callTool,
|
|
4519
4473
|
state,
|
|
4520
|
-
mcpServer
|
|
4521
|
-
registry,
|
|
4522
|
-
webhookRegistry
|
|
4474
|
+
mcpServer
|
|
4523
4475
|
);
|
|
4524
4476
|
}
|
|
4525
4477
|
console.log("[createSkedyulServer] Creating serverless instance");
|
|
4526
|
-
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
4478
|
+
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer);
|
|
4527
4479
|
console.log("[createSkedyulServer] Serverless instance created successfully");
|
|
4528
4480
|
return serverlessInstance;
|
|
4529
4481
|
}
|
|
@@ -4922,18 +4874,14 @@ Built config for sync:`);
|
|
|
4922
4874
|
} catch (error) {
|
|
4923
4875
|
console.warn(`Could not load install handler: ${error instanceof Error ? error.message : String(error)}`);
|
|
4924
4876
|
}
|
|
4925
|
-
const server2 = createSkedyulServer(
|
|
4926
|
-
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
hooks: installHandler ? { install: installHandler } : void 0
|
|
4934
|
-
},
|
|
4935
|
-
registry
|
|
4936
|
-
);
|
|
4877
|
+
const server2 = createSkedyulServer({
|
|
4878
|
+
name: serverName,
|
|
4879
|
+
version: serverVersion,
|
|
4880
|
+
computeLayer: "dedicated",
|
|
4881
|
+
defaultPort: port,
|
|
4882
|
+
tools: registry,
|
|
4883
|
+
hooks: installHandler ? { install: installHandler } : void 0
|
|
4884
|
+
});
|
|
4937
4885
|
const dedicatedServer = server2;
|
|
4938
4886
|
try {
|
|
4939
4887
|
await dedicatedServer.listen(port);
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* This module defines the main configuration interfaces for Skedyul apps.
|
|
5
5
|
*/
|
|
6
6
|
import type { ToolRegistry, WebhookRegistry, ToolMetadata, WebhookMetadata } from '../types';
|
|
7
|
+
import type { ServerHooks } from '../types/handlers';
|
|
8
|
+
import type { CoreApiConfig } from '../core/types';
|
|
7
9
|
import type { EnvSchema, ComputeLayer, ModelDefinition, RelationshipDefinition, ChannelDefinition, WorkflowDefinition, PageDefinition, NavigationConfig, AgentDefinition } from './types';
|
|
8
10
|
/**
|
|
9
11
|
* Install configuration - defines per-install env vars and SHARED models.
|
|
@@ -44,8 +46,18 @@ export interface BuildConfig {
|
|
|
44
46
|
/** External dependencies to exclude from bundling (e.g., ['twilio', 'stripe']) */
|
|
45
47
|
external?: string[];
|
|
46
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* CORS configuration options.
|
|
51
|
+
*/
|
|
52
|
+
export interface CorsOptions {
|
|
53
|
+
allowOrigin?: string;
|
|
54
|
+
allowMethods?: string;
|
|
55
|
+
allowHeaders?: string;
|
|
56
|
+
}
|
|
47
57
|
/**
|
|
48
58
|
* Main Skedyul app configuration.
|
|
59
|
+
* This is the unified config type used for both declarative config (skedyul.config.ts)
|
|
60
|
+
* and runtime server creation (server.create()).
|
|
49
61
|
*/
|
|
50
62
|
export interface SkedyulConfig {
|
|
51
63
|
/** App name */
|
|
@@ -56,8 +68,16 @@ export interface SkedyulConfig {
|
|
|
56
68
|
description?: string;
|
|
57
69
|
/** Compute layer: 'serverless' (Lambda) or 'dedicated' (ECS/Docker) */
|
|
58
70
|
computeLayer?: ComputeLayer;
|
|
59
|
-
/**
|
|
60
|
-
|
|
71
|
+
/** Default port for dedicated mode HTTP server */
|
|
72
|
+
defaultPort?: number;
|
|
73
|
+
/** Maximum requests before shutdown (serverless mode) */
|
|
74
|
+
maxRequests?: number | null;
|
|
75
|
+
/** TTL extension in seconds */
|
|
76
|
+
ttlExtendSeconds?: number;
|
|
77
|
+
/** CORS configuration */
|
|
78
|
+
cors?: CorsOptions;
|
|
79
|
+
/** Core API configuration */
|
|
80
|
+
coreApi?: CoreApiConfig;
|
|
61
81
|
/** Tool registry - direct object or dynamic import */
|
|
62
82
|
tools?: ToolRegistry | Promise<{
|
|
63
83
|
toolRegistry: ToolRegistry;
|
|
@@ -66,6 +86,8 @@ export interface SkedyulConfig {
|
|
|
66
86
|
webhooks?: WebhookRegistry | Promise<{
|
|
67
87
|
webhookRegistry: WebhookRegistry;
|
|
68
88
|
}>;
|
|
89
|
+
/** Lifecycle hooks for install, provision, uninstall, and oauth_callback */
|
|
90
|
+
hooks?: ServerHooks;
|
|
69
91
|
/** Provision configuration - direct object or dynamic import */
|
|
70
92
|
provision?: ProvisionConfig | Promise<{
|
|
71
93
|
default: ProvisionConfig;
|
|
@@ -76,6 +98,8 @@ export interface SkedyulConfig {
|
|
|
76
98
|
}>;
|
|
77
99
|
/** Agent definitions - multi-tenant agents with tool bindings */
|
|
78
100
|
agents?: AgentDefinition[];
|
|
101
|
+
/** Build configuration for the integration */
|
|
102
|
+
build?: BuildConfig;
|
|
79
103
|
}
|
|
80
104
|
/**
|
|
81
105
|
* Serializable config (for database storage).
|
package/dist/config/index.d.ts
CHANGED
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
* - All definition types extend BaseDefinition
|
|
10
10
|
*/
|
|
11
11
|
export * from './types';
|
|
12
|
-
export type { InstallConfig, ProvisionConfig, BuildConfig, SkedyulConfig, SerializableSkedyulConfig, } from './app-config';
|
|
12
|
+
export type { InstallConfig, ProvisionConfig, BuildConfig, CorsOptions, SkedyulConfig, SerializableSkedyulConfig, } from './app-config';
|
|
13
13
|
export { defineConfig } from './app-config';
|
|
14
14
|
export { defineModel, defineChannel, definePage, defineWorkflow, defineAgent, defineEnv, defineNavigation, } from './define';
|
|
15
15
|
export { CONFIG_FILE_NAMES, loadConfig, validateConfig } from './loader';
|
|
16
|
-
export { resolveConfig, createMinimalConfig } from './resolve';
|
|
17
16
|
export { getAllEnvKeys, getRequiredInstallEnvKeys } from './utils';
|
package/dist/dedicated/server.js
CHANGED
|
@@ -709,10 +709,11 @@ function padEnd(str, length) {
|
|
|
709
709
|
}
|
|
710
710
|
return str + " ".repeat(length - str.length);
|
|
711
711
|
}
|
|
712
|
-
function printStartupLog(config, tools,
|
|
712
|
+
function printStartupLog(config, tools, port) {
|
|
713
713
|
if (process.env.NODE_ENV === "test") {
|
|
714
714
|
return;
|
|
715
715
|
}
|
|
716
|
+
const webhookRegistry = config.webhooks;
|
|
716
717
|
const webhookCount = webhookRegistry ? Object.keys(webhookRegistry).length : 0;
|
|
717
718
|
const webhookNames = webhookRegistry ? Object.keys(webhookRegistry) : [];
|
|
718
719
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
@@ -725,9 +726,9 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
725
726
|
console.log(`\u2551 \u{1F680} Skedyul MCP Server Starting \u2551`);
|
|
726
727
|
console.log(`\u2560${divider}\u2563`);
|
|
727
728
|
console.log(`\u2551 \u2551`);
|
|
728
|
-
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.
|
|
729
|
-
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.
|
|
730
|
-
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer, 49)}\u2551`);
|
|
729
|
+
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.name, 49)}\u2551`);
|
|
730
|
+
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.version ?? "N/A", 49)}\u2551`);
|
|
731
|
+
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer ?? "serverless", 49)}\u2551`);
|
|
731
732
|
if (port) {
|
|
732
733
|
console.log(`\u2551 \u{1F310} Port: ${padEnd(String(port), 49)}\u2551`);
|
|
733
734
|
}
|
|
@@ -769,67 +770,40 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
769
770
|
console.log("");
|
|
770
771
|
}
|
|
771
772
|
|
|
772
|
-
// src/config
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
}
|
|
777
|
-
if (value instanceof Promise) {
|
|
778
|
-
const resolved = await value;
|
|
779
|
-
if (resolved && typeof resolved === "object" && "default" in resolved) {
|
|
780
|
-
return resolved.default;
|
|
781
|
-
}
|
|
782
|
-
return resolved;
|
|
783
|
-
}
|
|
784
|
-
return value;
|
|
785
|
-
}
|
|
786
|
-
function serializeTools(registry) {
|
|
787
|
-
return Object.entries(registry).map(([key, tool]) => ({
|
|
788
|
-
name: tool.name || key,
|
|
789
|
-
displayName: tool.label,
|
|
790
|
-
description: tool.description,
|
|
791
|
-
timeout: tool.timeout,
|
|
792
|
-
retries: tool.retries
|
|
793
|
-
}));
|
|
794
|
-
}
|
|
795
|
-
function serializeWebhooks(registry) {
|
|
796
|
-
return Object.values(registry).map((webhook) => ({
|
|
797
|
-
name: webhook.name,
|
|
798
|
-
description: webhook.description,
|
|
799
|
-
methods: webhook.methods ?? ["POST"],
|
|
800
|
-
type: webhook.type ?? "WEBHOOK"
|
|
801
|
-
}));
|
|
802
|
-
}
|
|
803
|
-
async function resolveConfig(config, registry, webhookRegistry) {
|
|
804
|
-
const provision = await resolveDynamicImport(
|
|
805
|
-
config.provision
|
|
806
|
-
);
|
|
807
|
-
const install = await resolveDynamicImport(
|
|
808
|
-
config.install
|
|
809
|
-
);
|
|
810
|
-
const tools = serializeTools(registry);
|
|
811
|
-
const webhooks = webhookRegistry ? serializeWebhooks(webhookRegistry) : [];
|
|
773
|
+
// src/server/config-serializer.ts
|
|
774
|
+
function serializeConfig(config) {
|
|
775
|
+
const registry = config.tools;
|
|
776
|
+
const webhookRegistry = config.webhooks;
|
|
812
777
|
return {
|
|
813
778
|
name: config.name,
|
|
814
779
|
version: config.version,
|
|
815
780
|
description: config.description,
|
|
816
781
|
computeLayer: config.computeLayer,
|
|
817
|
-
tools,
|
|
818
|
-
|
|
819
|
-
|
|
782
|
+
tools: registry ? Object.entries(registry).map(([key, tool]) => ({
|
|
783
|
+
name: tool.name || key,
|
|
784
|
+
description: tool.description,
|
|
785
|
+
timeout: tool.timeout,
|
|
786
|
+
retries: tool.retries
|
|
787
|
+
})) : [],
|
|
788
|
+
webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
|
|
789
|
+
name: w.name,
|
|
790
|
+
description: w.description,
|
|
791
|
+
methods: w.methods ?? ["POST"],
|
|
792
|
+
type: w.type ?? "WEBHOOK"
|
|
793
|
+
})) : [],
|
|
794
|
+
provision: isProvisionConfig(config.provision) ? config.provision : void 0,
|
|
820
795
|
agents: config.agents
|
|
821
796
|
};
|
|
822
797
|
}
|
|
823
|
-
function
|
|
824
|
-
return
|
|
825
|
-
name,
|
|
826
|
-
version
|
|
827
|
-
};
|
|
798
|
+
function isProvisionConfig(value) {
|
|
799
|
+
return value !== void 0 && value !== null && !(value instanceof Promise);
|
|
828
800
|
}
|
|
829
801
|
|
|
830
802
|
// src/server/dedicated.ts
|
|
831
|
-
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
803
|
+
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer) {
|
|
832
804
|
const port = getListeningPort(config);
|
|
805
|
+
const registry = config.tools;
|
|
806
|
+
const webhookRegistry = config.webhooks;
|
|
833
807
|
const httpServer = import_http2.default.createServer(
|
|
834
808
|
async (req, res) => {
|
|
835
809
|
function sendCoreResult(result) {
|
|
@@ -846,19 +820,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
846
820
|
return;
|
|
847
821
|
}
|
|
848
822
|
if (pathname === "/config" && req.method === "GET") {
|
|
849
|
-
|
|
850
|
-
if (!appConfig && config.appConfigLoader) {
|
|
851
|
-
const loaded = await config.appConfigLoader();
|
|
852
|
-
appConfig = loaded.default;
|
|
853
|
-
}
|
|
854
|
-
if (!appConfig) {
|
|
855
|
-
appConfig = createMinimalConfig(
|
|
856
|
-
config.metadata.name,
|
|
857
|
-
config.metadata.version
|
|
858
|
-
);
|
|
859
|
-
}
|
|
860
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
861
|
-
sendJSON(res, 200, serializedConfig);
|
|
823
|
+
sendJSON(res, 200, serializeConfig(config));
|
|
862
824
|
return;
|
|
863
825
|
}
|
|
864
826
|
if (pathname.startsWith("/webhooks/") && webhookRegistry) {
|
|
@@ -1387,7 +1349,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
1387
1349
|
const finalPort = listenPort ?? port;
|
|
1388
1350
|
return new Promise((resolve, reject) => {
|
|
1389
1351
|
httpServer.listen(finalPort, () => {
|
|
1390
|
-
printStartupLog(config, tools,
|
|
1352
|
+
printStartupLog(config, tools, finalPort);
|
|
1391
1353
|
resolve();
|
|
1392
1354
|
});
|
|
1393
1355
|
httpServer.once("error", reject);
|
|
@@ -1398,13 +1360,15 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
1398
1360
|
}
|
|
1399
1361
|
|
|
1400
1362
|
// src/server/serverless.ts
|
|
1401
|
-
function createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
1363
|
+
function createServerlessInstance(config, tools, callTool, state, mcpServer) {
|
|
1402
1364
|
const headers = getDefaultHeaders(config.cors);
|
|
1365
|
+
const registry = config.tools;
|
|
1366
|
+
const webhookRegistry = config.webhooks;
|
|
1403
1367
|
let hasLoggedStartup = false;
|
|
1404
1368
|
return {
|
|
1405
1369
|
async handler(event) {
|
|
1406
1370
|
if (!hasLoggedStartup) {
|
|
1407
|
-
printStartupLog(config, tools
|
|
1371
|
+
printStartupLog(config, tools);
|
|
1408
1372
|
hasLoggedStartup = true;
|
|
1409
1373
|
}
|
|
1410
1374
|
try {
|
|
@@ -1949,19 +1913,7 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
|
|
|
1949
1913
|
return createResponse(200, state.getHealthStatus(), headers);
|
|
1950
1914
|
}
|
|
1951
1915
|
if (path === "/config" && method === "GET") {
|
|
1952
|
-
|
|
1953
|
-
if (!appConfig && config.appConfigLoader) {
|
|
1954
|
-
const loaded = await config.appConfigLoader();
|
|
1955
|
-
appConfig = loaded.default;
|
|
1956
|
-
}
|
|
1957
|
-
if (!appConfig) {
|
|
1958
|
-
appConfig = createMinimalConfig(
|
|
1959
|
-
config.metadata.name,
|
|
1960
|
-
config.metadata.version
|
|
1961
|
-
);
|
|
1962
|
-
}
|
|
1963
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
1964
|
-
return createResponse(200, serializedConfig, headers);
|
|
1916
|
+
return createResponse(200, serializeConfig(config), headers);
|
|
1965
1917
|
}
|
|
1966
1918
|
if (path === "/mcp" && method === "POST") {
|
|
1967
1919
|
let body;
|
|
@@ -2179,9 +2131,11 @@ console.log("[skedyul-node/server] All imports complete");
|
|
|
2179
2131
|
console.log("[skedyul-node/server] Installing context logger...");
|
|
2180
2132
|
installContextLogger();
|
|
2181
2133
|
console.log("[skedyul-node/server] Context logger installed");
|
|
2182
|
-
function createSkedyulServer(config
|
|
2134
|
+
function createSkedyulServer(config) {
|
|
2183
2135
|
console.log("[createSkedyulServer] Step 1: mergeRuntimeEnv()");
|
|
2184
2136
|
mergeRuntimeEnv();
|
|
2137
|
+
const registry = config.tools;
|
|
2138
|
+
const webhookRegistry = config.webhooks;
|
|
2185
2139
|
console.log("[createSkedyulServer] Step 2: coreApi setup");
|
|
2186
2140
|
if (config.coreApi?.service) {
|
|
2187
2141
|
coreApiService.register(config.coreApi.service);
|
|
@@ -2193,7 +2147,7 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
2193
2147
|
const tools = buildToolMetadata(registry);
|
|
2194
2148
|
console.log("[createSkedyulServer] Step 3 done, tools:", tools.length);
|
|
2195
2149
|
const toolNames = Object.values(registry).map((tool) => tool.name);
|
|
2196
|
-
const runtimeLabel = config.computeLayer;
|
|
2150
|
+
const runtimeLabel = config.computeLayer ?? "serverless";
|
|
2197
2151
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
2198
2152
|
const ttlExtendSeconds = config.ttlExtendSeconds ?? parseNumberEnv(process.env.MCP_TTL_EXTEND) ?? 3600;
|
|
2199
2153
|
console.log("[createSkedyulServer] Step 4: createRequestState()");
|
|
@@ -2206,8 +2160,8 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
2206
2160
|
console.log("[createSkedyulServer] Step 4 done");
|
|
2207
2161
|
console.log("[createSkedyulServer] Step 5: new McpServer()");
|
|
2208
2162
|
const mcpServer = new import_mcp.McpServer({
|
|
2209
|
-
name: config.
|
|
2210
|
-
version: config.
|
|
2163
|
+
name: config.name,
|
|
2164
|
+
version: config.version ?? "0.0.0"
|
|
2211
2165
|
});
|
|
2212
2166
|
console.log("[createSkedyulServer] Step 5 done");
|
|
2213
2167
|
const dedicatedShutdown = () => {
|
|
@@ -2335,13 +2289,11 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
2335
2289
|
tools,
|
|
2336
2290
|
callTool,
|
|
2337
2291
|
state,
|
|
2338
|
-
mcpServer
|
|
2339
|
-
registry,
|
|
2340
|
-
webhookRegistry
|
|
2292
|
+
mcpServer
|
|
2341
2293
|
);
|
|
2342
2294
|
}
|
|
2343
2295
|
console.log("[createSkedyulServer] Creating serverless instance");
|
|
2344
|
-
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
2296
|
+
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer);
|
|
2345
2297
|
console.log("[createSkedyulServer] Serverless instance created successfully");
|
|
2346
2298
|
return serverlessInstance;
|
|
2347
2299
|
}
|