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/esm/index.mjs
CHANGED
|
@@ -2395,10 +2395,11 @@ function padEnd(str, length) {
|
|
|
2395
2395
|
}
|
|
2396
2396
|
return str + " ".repeat(length - str.length);
|
|
2397
2397
|
}
|
|
2398
|
-
function printStartupLog(config, tools,
|
|
2398
|
+
function printStartupLog(config, tools, port) {
|
|
2399
2399
|
if (process.env.NODE_ENV === "test") {
|
|
2400
2400
|
return;
|
|
2401
2401
|
}
|
|
2402
|
+
const webhookRegistry = config.webhooks;
|
|
2402
2403
|
const webhookCount = webhookRegistry ? Object.keys(webhookRegistry).length : 0;
|
|
2403
2404
|
const webhookNames = webhookRegistry ? Object.keys(webhookRegistry) : [];
|
|
2404
2405
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
@@ -2411,9 +2412,9 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
2411
2412
|
console.log(`\u2551 \u{1F680} Skedyul MCP Server Starting \u2551`);
|
|
2412
2413
|
console.log(`\u2560${divider}\u2563`);
|
|
2413
2414
|
console.log(`\u2551 \u2551`);
|
|
2414
|
-
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.
|
|
2415
|
-
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.
|
|
2416
|
-
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer, 49)}\u2551`);
|
|
2415
|
+
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.name, 49)}\u2551`);
|
|
2416
|
+
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.version ?? "N/A", 49)}\u2551`);
|
|
2417
|
+
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer ?? "serverless", 49)}\u2551`);
|
|
2417
2418
|
if (port) {
|
|
2418
2419
|
console.log(`\u2551 \u{1F310} Port: ${padEnd(String(port), 49)}\u2551`);
|
|
2419
2420
|
}
|
|
@@ -2455,67 +2456,40 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
2455
2456
|
console.log("");
|
|
2456
2457
|
}
|
|
2457
2458
|
|
|
2458
|
-
// src/config
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
}
|
|
2463
|
-
if (value instanceof Promise) {
|
|
2464
|
-
const resolved = await value;
|
|
2465
|
-
if (resolved && typeof resolved === "object" && "default" in resolved) {
|
|
2466
|
-
return resolved.default;
|
|
2467
|
-
}
|
|
2468
|
-
return resolved;
|
|
2469
|
-
}
|
|
2470
|
-
return value;
|
|
2471
|
-
}
|
|
2472
|
-
function serializeTools(registry) {
|
|
2473
|
-
return Object.entries(registry).map(([key, tool]) => ({
|
|
2474
|
-
name: tool.name || key,
|
|
2475
|
-
displayName: tool.label,
|
|
2476
|
-
description: tool.description,
|
|
2477
|
-
timeout: tool.timeout,
|
|
2478
|
-
retries: tool.retries
|
|
2479
|
-
}));
|
|
2480
|
-
}
|
|
2481
|
-
function serializeWebhooks(registry) {
|
|
2482
|
-
return Object.values(registry).map((webhook2) => ({
|
|
2483
|
-
name: webhook2.name,
|
|
2484
|
-
description: webhook2.description,
|
|
2485
|
-
methods: webhook2.methods ?? ["POST"],
|
|
2486
|
-
type: webhook2.type ?? "WEBHOOK"
|
|
2487
|
-
}));
|
|
2488
|
-
}
|
|
2489
|
-
async function resolveConfig(config, registry, webhookRegistry) {
|
|
2490
|
-
const provision = await resolveDynamicImport(
|
|
2491
|
-
config.provision
|
|
2492
|
-
);
|
|
2493
|
-
const install = await resolveDynamicImport(
|
|
2494
|
-
config.install
|
|
2495
|
-
);
|
|
2496
|
-
const tools = serializeTools(registry);
|
|
2497
|
-
const webhooks = webhookRegistry ? serializeWebhooks(webhookRegistry) : [];
|
|
2459
|
+
// src/server/config-serializer.ts
|
|
2460
|
+
function serializeConfig(config) {
|
|
2461
|
+
const registry = config.tools;
|
|
2462
|
+
const webhookRegistry = config.webhooks;
|
|
2498
2463
|
return {
|
|
2499
2464
|
name: config.name,
|
|
2500
2465
|
version: config.version,
|
|
2501
2466
|
description: config.description,
|
|
2502
2467
|
computeLayer: config.computeLayer,
|
|
2503
|
-
tools,
|
|
2504
|
-
|
|
2505
|
-
|
|
2468
|
+
tools: registry ? Object.entries(registry).map(([key, tool]) => ({
|
|
2469
|
+
name: tool.name || key,
|
|
2470
|
+
description: tool.description,
|
|
2471
|
+
timeout: tool.timeout,
|
|
2472
|
+
retries: tool.retries
|
|
2473
|
+
})) : [],
|
|
2474
|
+
webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
|
|
2475
|
+
name: w.name,
|
|
2476
|
+
description: w.description,
|
|
2477
|
+
methods: w.methods ?? ["POST"],
|
|
2478
|
+
type: w.type ?? "WEBHOOK"
|
|
2479
|
+
})) : [],
|
|
2480
|
+
provision: isProvisionConfig(config.provision) ? config.provision : void 0,
|
|
2506
2481
|
agents: config.agents
|
|
2507
2482
|
};
|
|
2508
2483
|
}
|
|
2509
|
-
function
|
|
2510
|
-
return
|
|
2511
|
-
name,
|
|
2512
|
-
version
|
|
2513
|
-
};
|
|
2484
|
+
function isProvisionConfig(value) {
|
|
2485
|
+
return value !== void 0 && value !== null && !(value instanceof Promise);
|
|
2514
2486
|
}
|
|
2515
2487
|
|
|
2516
2488
|
// src/server/dedicated.ts
|
|
2517
|
-
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
2489
|
+
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer) {
|
|
2518
2490
|
const port = getListeningPort(config);
|
|
2491
|
+
const registry = config.tools;
|
|
2492
|
+
const webhookRegistry = config.webhooks;
|
|
2519
2493
|
const httpServer = http.createServer(
|
|
2520
2494
|
async (req, res) => {
|
|
2521
2495
|
function sendCoreResult(result) {
|
|
@@ -2532,19 +2506,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
2532
2506
|
return;
|
|
2533
2507
|
}
|
|
2534
2508
|
if (pathname === "/config" && req.method === "GET") {
|
|
2535
|
-
|
|
2536
|
-
if (!appConfig && config.appConfigLoader) {
|
|
2537
|
-
const loaded = await config.appConfigLoader();
|
|
2538
|
-
appConfig = loaded.default;
|
|
2539
|
-
}
|
|
2540
|
-
if (!appConfig) {
|
|
2541
|
-
appConfig = createMinimalConfig(
|
|
2542
|
-
config.metadata.name,
|
|
2543
|
-
config.metadata.version
|
|
2544
|
-
);
|
|
2545
|
-
}
|
|
2546
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
2547
|
-
sendJSON(res, 200, serializedConfig);
|
|
2509
|
+
sendJSON(res, 200, serializeConfig(config));
|
|
2548
2510
|
return;
|
|
2549
2511
|
}
|
|
2550
2512
|
if (pathname.startsWith("/webhooks/") && webhookRegistry) {
|
|
@@ -3073,7 +3035,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3073
3035
|
const finalPort = listenPort ?? port;
|
|
3074
3036
|
return new Promise((resolve2, reject) => {
|
|
3075
3037
|
httpServer.listen(finalPort, () => {
|
|
3076
|
-
printStartupLog(config, tools,
|
|
3038
|
+
printStartupLog(config, tools, finalPort);
|
|
3077
3039
|
resolve2();
|
|
3078
3040
|
});
|
|
3079
3041
|
httpServer.once("error", reject);
|
|
@@ -3084,13 +3046,15 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3084
3046
|
}
|
|
3085
3047
|
|
|
3086
3048
|
// src/server/serverless.ts
|
|
3087
|
-
function createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3049
|
+
function createServerlessInstance(config, tools, callTool, state, mcpServer) {
|
|
3088
3050
|
const headers = getDefaultHeaders(config.cors);
|
|
3051
|
+
const registry = config.tools;
|
|
3052
|
+
const webhookRegistry = config.webhooks;
|
|
3089
3053
|
let hasLoggedStartup = false;
|
|
3090
3054
|
return {
|
|
3091
3055
|
async handler(event) {
|
|
3092
3056
|
if (!hasLoggedStartup) {
|
|
3093
|
-
printStartupLog(config, tools
|
|
3057
|
+
printStartupLog(config, tools);
|
|
3094
3058
|
hasLoggedStartup = true;
|
|
3095
3059
|
}
|
|
3096
3060
|
try {
|
|
@@ -3635,19 +3599,7 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
|
|
|
3635
3599
|
return createResponse(200, state.getHealthStatus(), headers);
|
|
3636
3600
|
}
|
|
3637
3601
|
if (path2 === "/config" && method === "GET") {
|
|
3638
|
-
|
|
3639
|
-
if (!appConfig && config.appConfigLoader) {
|
|
3640
|
-
const loaded = await config.appConfigLoader();
|
|
3641
|
-
appConfig = loaded.default;
|
|
3642
|
-
}
|
|
3643
|
-
if (!appConfig) {
|
|
3644
|
-
appConfig = createMinimalConfig(
|
|
3645
|
-
config.metadata.name,
|
|
3646
|
-
config.metadata.version
|
|
3647
|
-
);
|
|
3648
|
-
}
|
|
3649
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
3650
|
-
return createResponse(200, serializedConfig, headers);
|
|
3602
|
+
return createResponse(200, serializeConfig(config), headers);
|
|
3651
3603
|
}
|
|
3652
3604
|
if (path2 === "/mcp" && method === "POST") {
|
|
3653
3605
|
let body;
|
|
@@ -3865,9 +3817,11 @@ console.log("[skedyul-node/server] All imports complete");
|
|
|
3865
3817
|
console.log("[skedyul-node/server] Installing context logger...");
|
|
3866
3818
|
installContextLogger();
|
|
3867
3819
|
console.log("[skedyul-node/server] Context logger installed");
|
|
3868
|
-
function createSkedyulServer(config
|
|
3820
|
+
function createSkedyulServer(config) {
|
|
3869
3821
|
console.log("[createSkedyulServer] Step 1: mergeRuntimeEnv()");
|
|
3870
3822
|
mergeRuntimeEnv();
|
|
3823
|
+
const registry = config.tools;
|
|
3824
|
+
const webhookRegistry = config.webhooks;
|
|
3871
3825
|
console.log("[createSkedyulServer] Step 2: coreApi setup");
|
|
3872
3826
|
if (config.coreApi?.service) {
|
|
3873
3827
|
coreApiService.register(config.coreApi.service);
|
|
@@ -3879,7 +3833,7 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
3879
3833
|
const tools = buildToolMetadata(registry);
|
|
3880
3834
|
console.log("[createSkedyulServer] Step 3 done, tools:", tools.length);
|
|
3881
3835
|
const toolNames = Object.values(registry).map((tool) => tool.name);
|
|
3882
|
-
const runtimeLabel = config.computeLayer;
|
|
3836
|
+
const runtimeLabel = config.computeLayer ?? "serverless";
|
|
3883
3837
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
3884
3838
|
const ttlExtendSeconds = config.ttlExtendSeconds ?? parseNumberEnv(process.env.MCP_TTL_EXTEND) ?? 3600;
|
|
3885
3839
|
console.log("[createSkedyulServer] Step 4: createRequestState()");
|
|
@@ -3892,8 +3846,8 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
3892
3846
|
console.log("[createSkedyulServer] Step 4 done");
|
|
3893
3847
|
console.log("[createSkedyulServer] Step 5: new McpServer()");
|
|
3894
3848
|
const mcpServer = new McpServer({
|
|
3895
|
-
name: config.
|
|
3896
|
-
version: config.
|
|
3849
|
+
name: config.name,
|
|
3850
|
+
version: config.version ?? "0.0.0"
|
|
3897
3851
|
});
|
|
3898
3852
|
console.log("[createSkedyulServer] Step 5 done");
|
|
3899
3853
|
const dedicatedShutdown = () => {
|
|
@@ -4021,13 +3975,11 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4021
3975
|
tools,
|
|
4022
3976
|
callTool,
|
|
4023
3977
|
state,
|
|
4024
|
-
mcpServer
|
|
4025
|
-
registry,
|
|
4026
|
-
webhookRegistry
|
|
3978
|
+
mcpServer
|
|
4027
3979
|
);
|
|
4028
3980
|
}
|
|
4029
3981
|
console.log("[createSkedyulServer] Creating serverless instance");
|
|
4030
|
-
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3982
|
+
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer);
|
|
4031
3983
|
console.log("[createSkedyulServer] Serverless instance created successfully");
|
|
4032
3984
|
return serverlessInstance;
|
|
4033
3985
|
}
|
|
@@ -4348,7 +4300,6 @@ export {
|
|
|
4348
4300
|
communicationChannel,
|
|
4349
4301
|
configure,
|
|
4350
4302
|
createContextLogger,
|
|
4351
|
-
createMinimalConfig,
|
|
4352
4303
|
createServerHookContext,
|
|
4353
4304
|
createToolCallContext,
|
|
4354
4305
|
createWebhookContext,
|
|
@@ -4375,7 +4326,6 @@ export {
|
|
|
4375
4326
|
isWorkflowDependency,
|
|
4376
4327
|
loadConfig,
|
|
4377
4328
|
report,
|
|
4378
|
-
resolveConfig,
|
|
4379
4329
|
resource,
|
|
4380
4330
|
runWithConfig,
|
|
4381
4331
|
safeParseConfig,
|
package/dist/index.d.ts
CHANGED
|
@@ -15,5 +15,5 @@ declare const _default: {
|
|
|
15
15
|
z: typeof z;
|
|
16
16
|
};
|
|
17
17
|
export default _default;
|
|
18
|
-
export { defineConfig, defineModel, defineChannel, definePage, defineWorkflow, defineAgent, defineEnv, defineNavigation, loadConfig, validateConfig,
|
|
18
|
+
export { defineConfig, defineModel, defineChannel, definePage, defineWorkflow, defineAgent, defineEnv, defineNavigation, loadConfig, validateConfig, CONFIG_FILE_NAMES, getAllEnvKeys, getRequiredInstallEnvKeys, } from './config';
|
|
19
19
|
export type { SkedyulConfig, SerializableSkedyulConfig, InstallConfig, ProvisionConfig, BaseDefinition, Scope, FieldOwner, Visibility, ComputeLayer, StructuredFilter, FilterOperator, FilterCondition, FieldOption, EnvVariable, EnvSchema, FieldType, Cardinality, OnDelete, InlineFieldDefinition, FieldVisibility, FieldDefinition, ModelDefinition, RelationshipLink, RelationshipDefinition, CapabilityType, ChannelCapability, ChannelFieldPermissions, ChannelField, ChannelDefinition, WorkflowActionInput, WorkflowAction, WorkflowDefinition, AgentDefinition, NavigationItem, NavigationSection, NavigationSidebar, BreadcrumbItem, NavigationBreadcrumb, NavigationConfig, ContextMode, ContextItemModel, ContextItemTool, ContextItem, ContextDefinition, FormStyleProps, ButtonVariant, ButtonSize, ButtonProps, RelationshipExtension, FormHeader, ActionDefinition, ModalFormDefinition, InputComponent, TextareaComponent, SelectComponent, ComboboxComponent, CheckboxComponent, DatePickerComponent, TimePickerComponent, StatusIndicator, FieldSettingComponent, ImageSettingComponent, FileSettingComponent, ListItemTemplate, ListComponent, EmptyFormComponent, AlertComponent, FormComponent, FormLayoutColumn, FormLayoutRow, FormLayoutConfig, FormProps, CardHeader, CardBlock, ListBlock, ModelMapperBlock, BlockDefinition, PageType, PageDefinition, HttpMethod, WebhookRequest, WebhookHandlerContext, WebhookHandlerResponse, WebhookHandlerFn, WebhookHandlerDefinition, Webhooks, WebhookHandlerMetadata, ModelDependency, ChannelDependency, WorkflowDependency, ResourceDependency, } from './config';
|
package/dist/index.js
CHANGED
|
@@ -136,7 +136,6 @@ __export(index_exports, {
|
|
|
136
136
|
communicationChannel: () => communicationChannel,
|
|
137
137
|
configure: () => configure,
|
|
138
138
|
createContextLogger: () => createContextLogger,
|
|
139
|
-
createMinimalConfig: () => createMinimalConfig,
|
|
140
139
|
createServerHookContext: () => createServerHookContext,
|
|
141
140
|
createToolCallContext: () => createToolCallContext,
|
|
142
141
|
createWebhookContext: () => createWebhookContext,
|
|
@@ -163,7 +162,6 @@ __export(index_exports, {
|
|
|
163
162
|
isWorkflowDependency: () => isWorkflowDependency,
|
|
164
163
|
loadConfig: () => loadConfig,
|
|
165
164
|
report: () => report,
|
|
166
|
-
resolveConfig: () => resolveConfig,
|
|
167
165
|
resource: () => resource,
|
|
168
166
|
runWithConfig: () => runWithConfig,
|
|
169
167
|
safeParseConfig: () => safeParseConfig,
|
|
@@ -2563,10 +2561,11 @@ function padEnd(str, length) {
|
|
|
2563
2561
|
}
|
|
2564
2562
|
return str + " ".repeat(length - str.length);
|
|
2565
2563
|
}
|
|
2566
|
-
function printStartupLog(config, tools,
|
|
2564
|
+
function printStartupLog(config, tools, port) {
|
|
2567
2565
|
if (process.env.NODE_ENV === "test") {
|
|
2568
2566
|
return;
|
|
2569
2567
|
}
|
|
2568
|
+
const webhookRegistry = config.webhooks;
|
|
2570
2569
|
const webhookCount = webhookRegistry ? Object.keys(webhookRegistry).length : 0;
|
|
2571
2570
|
const webhookNames = webhookRegistry ? Object.keys(webhookRegistry) : [];
|
|
2572
2571
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
@@ -2579,9 +2578,9 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
2579
2578
|
console.log(`\u2551 \u{1F680} Skedyul MCP Server Starting \u2551`);
|
|
2580
2579
|
console.log(`\u2560${divider}\u2563`);
|
|
2581
2580
|
console.log(`\u2551 \u2551`);
|
|
2582
|
-
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.
|
|
2583
|
-
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.
|
|
2584
|
-
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer, 49)}\u2551`);
|
|
2581
|
+
console.log(`\u2551 \u{1F4E6} Server: ${padEnd(config.name, 49)}\u2551`);
|
|
2582
|
+
console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.version ?? "N/A", 49)}\u2551`);
|
|
2583
|
+
console.log(`\u2551 \u26A1 Compute: ${padEnd(config.computeLayer ?? "serverless", 49)}\u2551`);
|
|
2585
2584
|
if (port) {
|
|
2586
2585
|
console.log(`\u2551 \u{1F310} Port: ${padEnd(String(port), 49)}\u2551`);
|
|
2587
2586
|
}
|
|
@@ -2623,67 +2622,40 @@ function printStartupLog(config, tools, webhookRegistry, port) {
|
|
|
2623
2622
|
console.log("");
|
|
2624
2623
|
}
|
|
2625
2624
|
|
|
2626
|
-
// src/config
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
}
|
|
2631
|
-
if (value instanceof Promise) {
|
|
2632
|
-
const resolved = await value;
|
|
2633
|
-
if (resolved && typeof resolved === "object" && "default" in resolved) {
|
|
2634
|
-
return resolved.default;
|
|
2635
|
-
}
|
|
2636
|
-
return resolved;
|
|
2637
|
-
}
|
|
2638
|
-
return value;
|
|
2639
|
-
}
|
|
2640
|
-
function serializeTools(registry) {
|
|
2641
|
-
return Object.entries(registry).map(([key, tool]) => ({
|
|
2642
|
-
name: tool.name || key,
|
|
2643
|
-
displayName: tool.label,
|
|
2644
|
-
description: tool.description,
|
|
2645
|
-
timeout: tool.timeout,
|
|
2646
|
-
retries: tool.retries
|
|
2647
|
-
}));
|
|
2648
|
-
}
|
|
2649
|
-
function serializeWebhooks(registry) {
|
|
2650
|
-
return Object.values(registry).map((webhook2) => ({
|
|
2651
|
-
name: webhook2.name,
|
|
2652
|
-
description: webhook2.description,
|
|
2653
|
-
methods: webhook2.methods ?? ["POST"],
|
|
2654
|
-
type: webhook2.type ?? "WEBHOOK"
|
|
2655
|
-
}));
|
|
2656
|
-
}
|
|
2657
|
-
async function resolveConfig(config, registry, webhookRegistry) {
|
|
2658
|
-
const provision = await resolveDynamicImport(
|
|
2659
|
-
config.provision
|
|
2660
|
-
);
|
|
2661
|
-
const install = await resolveDynamicImport(
|
|
2662
|
-
config.install
|
|
2663
|
-
);
|
|
2664
|
-
const tools = serializeTools(registry);
|
|
2665
|
-
const webhooks = webhookRegistry ? serializeWebhooks(webhookRegistry) : [];
|
|
2625
|
+
// src/server/config-serializer.ts
|
|
2626
|
+
function serializeConfig(config) {
|
|
2627
|
+
const registry = config.tools;
|
|
2628
|
+
const webhookRegistry = config.webhooks;
|
|
2666
2629
|
return {
|
|
2667
2630
|
name: config.name,
|
|
2668
2631
|
version: config.version,
|
|
2669
2632
|
description: config.description,
|
|
2670
2633
|
computeLayer: config.computeLayer,
|
|
2671
|
-
tools,
|
|
2672
|
-
|
|
2673
|
-
|
|
2634
|
+
tools: registry ? Object.entries(registry).map(([key, tool]) => ({
|
|
2635
|
+
name: tool.name || key,
|
|
2636
|
+
description: tool.description,
|
|
2637
|
+
timeout: tool.timeout,
|
|
2638
|
+
retries: tool.retries
|
|
2639
|
+
})) : [],
|
|
2640
|
+
webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
|
|
2641
|
+
name: w.name,
|
|
2642
|
+
description: w.description,
|
|
2643
|
+
methods: w.methods ?? ["POST"],
|
|
2644
|
+
type: w.type ?? "WEBHOOK"
|
|
2645
|
+
})) : [],
|
|
2646
|
+
provision: isProvisionConfig(config.provision) ? config.provision : void 0,
|
|
2674
2647
|
agents: config.agents
|
|
2675
2648
|
};
|
|
2676
2649
|
}
|
|
2677
|
-
function
|
|
2678
|
-
return
|
|
2679
|
-
name,
|
|
2680
|
-
version
|
|
2681
|
-
};
|
|
2650
|
+
function isProvisionConfig(value) {
|
|
2651
|
+
return value !== void 0 && value !== null && !(value instanceof Promise);
|
|
2682
2652
|
}
|
|
2683
2653
|
|
|
2684
2654
|
// src/server/dedicated.ts
|
|
2685
|
-
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
2655
|
+
function createDedicatedServerInstance(config, tools, callTool, state, mcpServer) {
|
|
2686
2656
|
const port = getListeningPort(config);
|
|
2657
|
+
const registry = config.tools;
|
|
2658
|
+
const webhookRegistry = config.webhooks;
|
|
2687
2659
|
const httpServer = import_http2.default.createServer(
|
|
2688
2660
|
async (req, res) => {
|
|
2689
2661
|
function sendCoreResult(result) {
|
|
@@ -2700,19 +2672,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
2700
2672
|
return;
|
|
2701
2673
|
}
|
|
2702
2674
|
if (pathname === "/config" && req.method === "GET") {
|
|
2703
|
-
|
|
2704
|
-
if (!appConfig && config.appConfigLoader) {
|
|
2705
|
-
const loaded = await config.appConfigLoader();
|
|
2706
|
-
appConfig = loaded.default;
|
|
2707
|
-
}
|
|
2708
|
-
if (!appConfig) {
|
|
2709
|
-
appConfig = createMinimalConfig(
|
|
2710
|
-
config.metadata.name,
|
|
2711
|
-
config.metadata.version
|
|
2712
|
-
);
|
|
2713
|
-
}
|
|
2714
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
2715
|
-
sendJSON(res, 200, serializedConfig);
|
|
2675
|
+
sendJSON(res, 200, serializeConfig(config));
|
|
2716
2676
|
return;
|
|
2717
2677
|
}
|
|
2718
2678
|
if (pathname.startsWith("/webhooks/") && webhookRegistry) {
|
|
@@ -3241,7 +3201,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3241
3201
|
const finalPort = listenPort ?? port;
|
|
3242
3202
|
return new Promise((resolve2, reject) => {
|
|
3243
3203
|
httpServer.listen(finalPort, () => {
|
|
3244
|
-
printStartupLog(config, tools,
|
|
3204
|
+
printStartupLog(config, tools, finalPort);
|
|
3245
3205
|
resolve2();
|
|
3246
3206
|
});
|
|
3247
3207
|
httpServer.once("error", reject);
|
|
@@ -3252,13 +3212,15 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3252
3212
|
}
|
|
3253
3213
|
|
|
3254
3214
|
// src/server/serverless.ts
|
|
3255
|
-
function createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3215
|
+
function createServerlessInstance(config, tools, callTool, state, mcpServer) {
|
|
3256
3216
|
const headers = getDefaultHeaders(config.cors);
|
|
3217
|
+
const registry = config.tools;
|
|
3218
|
+
const webhookRegistry = config.webhooks;
|
|
3257
3219
|
let hasLoggedStartup = false;
|
|
3258
3220
|
return {
|
|
3259
3221
|
async handler(event) {
|
|
3260
3222
|
if (!hasLoggedStartup) {
|
|
3261
|
-
printStartupLog(config, tools
|
|
3223
|
+
printStartupLog(config, tools);
|
|
3262
3224
|
hasLoggedStartup = true;
|
|
3263
3225
|
}
|
|
3264
3226
|
try {
|
|
@@ -3803,19 +3765,7 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
|
|
|
3803
3765
|
return createResponse(200, state.getHealthStatus(), headers);
|
|
3804
3766
|
}
|
|
3805
3767
|
if (path2 === "/config" && method === "GET") {
|
|
3806
|
-
|
|
3807
|
-
if (!appConfig && config.appConfigLoader) {
|
|
3808
|
-
const loaded = await config.appConfigLoader();
|
|
3809
|
-
appConfig = loaded.default;
|
|
3810
|
-
}
|
|
3811
|
-
if (!appConfig) {
|
|
3812
|
-
appConfig = createMinimalConfig(
|
|
3813
|
-
config.metadata.name,
|
|
3814
|
-
config.metadata.version
|
|
3815
|
-
);
|
|
3816
|
-
}
|
|
3817
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
3818
|
-
return createResponse(200, serializedConfig, headers);
|
|
3768
|
+
return createResponse(200, serializeConfig(config), headers);
|
|
3819
3769
|
}
|
|
3820
3770
|
if (path2 === "/mcp" && method === "POST") {
|
|
3821
3771
|
let body;
|
|
@@ -4033,9 +3983,11 @@ console.log("[skedyul-node/server] All imports complete");
|
|
|
4033
3983
|
console.log("[skedyul-node/server] Installing context logger...");
|
|
4034
3984
|
installContextLogger();
|
|
4035
3985
|
console.log("[skedyul-node/server] Context logger installed");
|
|
4036
|
-
function createSkedyulServer(config
|
|
3986
|
+
function createSkedyulServer(config) {
|
|
4037
3987
|
console.log("[createSkedyulServer] Step 1: mergeRuntimeEnv()");
|
|
4038
3988
|
mergeRuntimeEnv();
|
|
3989
|
+
const registry = config.tools;
|
|
3990
|
+
const webhookRegistry = config.webhooks;
|
|
4039
3991
|
console.log("[createSkedyulServer] Step 2: coreApi setup");
|
|
4040
3992
|
if (config.coreApi?.service) {
|
|
4041
3993
|
coreApiService.register(config.coreApi.service);
|
|
@@ -4047,7 +3999,7 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4047
3999
|
const tools = buildToolMetadata(registry);
|
|
4048
4000
|
console.log("[createSkedyulServer] Step 3 done, tools:", tools.length);
|
|
4049
4001
|
const toolNames = Object.values(registry).map((tool) => tool.name);
|
|
4050
|
-
const runtimeLabel = config.computeLayer;
|
|
4002
|
+
const runtimeLabel = config.computeLayer ?? "serverless";
|
|
4051
4003
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
4052
4004
|
const ttlExtendSeconds = config.ttlExtendSeconds ?? parseNumberEnv(process.env.MCP_TTL_EXTEND) ?? 3600;
|
|
4053
4005
|
console.log("[createSkedyulServer] Step 4: createRequestState()");
|
|
@@ -4060,8 +4012,8 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4060
4012
|
console.log("[createSkedyulServer] Step 4 done");
|
|
4061
4013
|
console.log("[createSkedyulServer] Step 5: new McpServer()");
|
|
4062
4014
|
const mcpServer = new import_mcp.McpServer({
|
|
4063
|
-
name: config.
|
|
4064
|
-
version: config.
|
|
4015
|
+
name: config.name,
|
|
4016
|
+
version: config.version ?? "0.0.0"
|
|
4065
4017
|
});
|
|
4066
4018
|
console.log("[createSkedyulServer] Step 5 done");
|
|
4067
4019
|
const dedicatedShutdown = () => {
|
|
@@ -4189,13 +4141,11 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4189
4141
|
tools,
|
|
4190
4142
|
callTool,
|
|
4191
4143
|
state,
|
|
4192
|
-
mcpServer
|
|
4193
|
-
registry,
|
|
4194
|
-
webhookRegistry
|
|
4144
|
+
mcpServer
|
|
4195
4145
|
);
|
|
4196
4146
|
}
|
|
4197
4147
|
console.log("[createSkedyulServer] Creating serverless instance");
|
|
4198
|
-
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
4148
|
+
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer);
|
|
4199
4149
|
console.log("[createSkedyulServer] Serverless instance created successfully");
|
|
4200
4150
|
return serverlessInstance;
|
|
4201
4151
|
}
|
|
@@ -4517,7 +4467,6 @@ var index_default = { z: import_v44.z };
|
|
|
4517
4467
|
communicationChannel,
|
|
4518
4468
|
configure,
|
|
4519
4469
|
createContextLogger,
|
|
4520
|
-
createMinimalConfig,
|
|
4521
4470
|
createServerHookContext,
|
|
4522
4471
|
createToolCallContext,
|
|
4523
4472
|
createWebhookContext,
|
|
@@ -4543,7 +4492,6 @@ var index_default = { z: import_v44.z };
|
|
|
4543
4492
|
isWorkflowDependency,
|
|
4544
4493
|
loadConfig,
|
|
4545
4494
|
report,
|
|
4546
|
-
resolveConfig,
|
|
4547
4495
|
resource,
|
|
4548
4496
|
runWithConfig,
|
|
4549
4497
|
safeParseConfig,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config serialization utilities for the /config endpoint.
|
|
3
|
+
*/
|
|
4
|
+
import type { SkedyulConfig, SerializableSkedyulConfig } from '../config/app-config';
|
|
5
|
+
/**
|
|
6
|
+
* Serializes a SkedyulConfig into a SerializableSkedyulConfig.
|
|
7
|
+
* Used by both serverless and dedicated servers for the /config endpoint.
|
|
8
|
+
*
|
|
9
|
+
* Note: provision and agents are included if they are direct objects (not promises).
|
|
10
|
+
* Promise-based configs from skedyul.config.ts are resolved at build time, not runtime.
|
|
11
|
+
*/
|
|
12
|
+
export declare function serializeConfig(config: SkedyulConfig): SerializableSkedyulConfig;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { SkedyulServerInstance, ToolCallResponse, ToolMetadata } from '../types';
|
|
3
|
+
import type { RuntimeSkedyulConfig } from './index';
|
|
3
4
|
import type { RequestState } from './types';
|
|
4
5
|
/**
|
|
5
6
|
* Creates a dedicated (long-running HTTP) server instance
|
|
6
7
|
*/
|
|
7
|
-
export declare function createDedicatedServerInstance(config:
|
|
8
|
+
export declare function createDedicatedServerInstance(config: RuntimeSkedyulConfig, tools: ToolMetadata[], callTool: (nameRaw: unknown, argsRaw: unknown) => Promise<ToolCallResponse>, state: RequestState, mcpServer: McpServer): SkedyulServerInstance;
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { DedicatedServerInstance, ServerlessServerInstance,
|
|
1
|
+
import type { DedicatedServerInstance, ServerlessServerInstance, SkedyulServerInstance, ToolRegistry, WebhookRegistry } from '../types';
|
|
2
|
+
import type { SkedyulConfig } from '../config/app-config';
|
|
2
3
|
export type { RequestState, CoreMethod, ToolCallArgs } from './types';
|
|
3
4
|
export { normalizeBilling, toJsonSchema, isToolSchemaWithJson, getZodSchema, getJsonSchemaFromToolSchema, parseJsonRecord, parseNumberEnv, mergeRuntimeEnv, readRawRequestBody, parseJSONBody, sendJSON, sendHTML, getDefaultHeaders, createResponse, getListeningPort, } from './utils';
|
|
4
5
|
export { handleCoreMethod } from './core-api-handler';
|
|
@@ -8,13 +9,21 @@ export { printStartupLog, padEnd } from './startup-logger';
|
|
|
8
9
|
export { createDedicatedServerInstance } from './dedicated';
|
|
9
10
|
export { createServerlessInstance } from './serverless';
|
|
10
11
|
export { runWithLogContext, getLogContext, installContextLogger, uninstallContextLogger } from './context-logger';
|
|
11
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Runtime config type - SkedyulConfig with resolved registries (not promises).
|
|
14
|
+
* This is what server.create() expects at runtime.
|
|
15
|
+
*/
|
|
16
|
+
export type RuntimeSkedyulConfig = Omit<SkedyulConfig, 'tools' | 'webhooks'> & {
|
|
17
|
+
tools: ToolRegistry;
|
|
18
|
+
webhooks?: WebhookRegistry;
|
|
19
|
+
};
|
|
20
|
+
export declare function createSkedyulServer(config: RuntimeSkedyulConfig & {
|
|
12
21
|
computeLayer: 'dedicated';
|
|
13
|
-
}
|
|
14
|
-
export declare function createSkedyulServer(config:
|
|
22
|
+
}): DedicatedServerInstance;
|
|
23
|
+
export declare function createSkedyulServer(config: RuntimeSkedyulConfig & {
|
|
15
24
|
computeLayer: 'serverless';
|
|
16
|
-
}
|
|
17
|
-
export declare function createSkedyulServer(config:
|
|
25
|
+
}): ServerlessServerInstance;
|
|
26
|
+
export declare function createSkedyulServer(config: RuntimeSkedyulConfig): SkedyulServerInstance;
|
|
18
27
|
export declare const server: {
|
|
19
28
|
create: typeof createSkedyulServer;
|
|
20
29
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { SkedyulServerInstance, ToolCallResponse, ToolMetadata } from '../types';
|
|
3
|
+
import type { RuntimeSkedyulConfig } from './index';
|
|
3
4
|
import type { RequestState } from './types';
|
|
4
5
|
/**
|
|
5
6
|
* Creates a serverless (Lambda-style) server instance
|
|
6
7
|
*/
|
|
7
|
-
export declare function createServerlessInstance(config:
|
|
8
|
+
export declare function createServerlessInstance(config: RuntimeSkedyulConfig, tools: ToolMetadata[], callTool: (nameRaw: unknown, argsRaw: unknown) => Promise<ToolCallResponse>, state: RequestState, mcpServer: McpServer): SkedyulServerInstance;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ToolMetadata } from '../types';
|
|
2
|
+
import type { SkedyulConfig } from '../config/app-config';
|
|
2
3
|
/**
|
|
3
4
|
* Pad a string to the right with spaces
|
|
4
5
|
*/
|
|
@@ -6,4 +7,4 @@ export declare function padEnd(str: string, length: number): string;
|
|
|
6
7
|
/**
|
|
7
8
|
* Prints a styled startup log showing server configuration
|
|
8
9
|
*/
|
|
9
|
-
export declare function printStartupLog(config:
|
|
10
|
+
export declare function printStartupLog(config: SkedyulConfig, tools: ToolMetadata[], port?: number): void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import http, { IncomingMessage } from 'http';
|
|
2
|
-
import type { APIGatewayProxyResult
|
|
2
|
+
import type { APIGatewayProxyResult } from '../../types';
|
|
3
|
+
import type { CorsOptions, SkedyulConfig } from '../../config/app-config';
|
|
3
4
|
/**
|
|
4
5
|
* Reads the raw request body from an IncomingMessage
|
|
5
6
|
*/
|
|
@@ -27,4 +28,4 @@ export declare function createResponse(statusCode: number, body: unknown, header
|
|
|
27
28
|
/**
|
|
28
29
|
* Gets the port to listen on from config or environment
|
|
29
30
|
*/
|
|
30
|
-
export declare function getListeningPort(config:
|
|
31
|
+
export declare function getListeningPort(config: SkedyulConfig): number;
|
package/dist/server.d.ts
CHANGED
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
* This file maintains backward compatibility while the actual implementation
|
|
5
5
|
* has been split into smaller, focused modules in the server/ folder.
|
|
6
6
|
*/
|
|
7
|
-
export { createSkedyulServer, server, type RequestState, type CoreMethod, type ToolCallArgs, normalizeBilling, toJsonSchema, isToolSchemaWithJson, getZodSchema, getJsonSchemaFromToolSchema, parseJsonRecord, parseNumberEnv, mergeRuntimeEnv, readRawRequestBody, parseJSONBody, sendJSON, sendHTML, getDefaultHeaders, createResponse, getListeningPort, handleCoreMethod, buildToolMetadata, createRequestState, createCallToolHandler, parseHandlerEnvelope, buildRequestFromRaw, buildRequestScopedConfig, printStartupLog, padEnd, createDedicatedServerInstance, createServerlessInstance, } from './server/index';
|
|
7
|
+
export { createSkedyulServer, server, type RequestState, type CoreMethod, type ToolCallArgs, type RuntimeSkedyulConfig, normalizeBilling, toJsonSchema, isToolSchemaWithJson, getZodSchema, getJsonSchemaFromToolSchema, parseJsonRecord, parseNumberEnv, mergeRuntimeEnv, readRawRequestBody, parseJSONBody, sendJSON, sendHTML, getDefaultHeaders, createResponse, getListeningPort, handleCoreMethod, buildToolMetadata, createRequestState, createCallToolHandler, parseHandlerEnvelope, buildRequestFromRaw, buildRequestScopedConfig, printStartupLog, padEnd, createDedicatedServerInstance, createServerlessInstance, } from './server/index';
|