skedyul 1.2.18 → 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 -88
- package/dist/config/app-config.d.ts +26 -2
- package/dist/config/index.d.ts +1 -2
- package/dist/dedicated/server.js +42 -76
- package/dist/esm/index.mjs +42 -78
- package/dist/index.d.ts +1 -1
- package/dist/index.js +42 -80
- 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 -76
- package/dist/serverless/server.mjs +42 -76
- package/dist/types/index.d.ts +1 -1
- package/dist/types/server.d.ts +0 -25
- 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,12 +2506,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
2532
2506
|
return;
|
|
2533
2507
|
}
|
|
2534
2508
|
if (pathname === "/config" && req.method === "GET") {
|
|
2535
|
-
|
|
2536
|
-
config.metadata.name,
|
|
2537
|
-
config.metadata.version
|
|
2538
|
-
);
|
|
2539
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
2540
|
-
sendJSON(res, 200, serializedConfig);
|
|
2509
|
+
sendJSON(res, 200, serializeConfig(config));
|
|
2541
2510
|
return;
|
|
2542
2511
|
}
|
|
2543
2512
|
if (pathname.startsWith("/webhooks/") && webhookRegistry) {
|
|
@@ -3066,7 +3035,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3066
3035
|
const finalPort = listenPort ?? port;
|
|
3067
3036
|
return new Promise((resolve2, reject) => {
|
|
3068
3037
|
httpServer.listen(finalPort, () => {
|
|
3069
|
-
printStartupLog(config, tools,
|
|
3038
|
+
printStartupLog(config, tools, finalPort);
|
|
3070
3039
|
resolve2();
|
|
3071
3040
|
});
|
|
3072
3041
|
httpServer.once("error", reject);
|
|
@@ -3077,13 +3046,15 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3077
3046
|
}
|
|
3078
3047
|
|
|
3079
3048
|
// src/server/serverless.ts
|
|
3080
|
-
function createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3049
|
+
function createServerlessInstance(config, tools, callTool, state, mcpServer) {
|
|
3081
3050
|
const headers = getDefaultHeaders(config.cors);
|
|
3051
|
+
const registry = config.tools;
|
|
3052
|
+
const webhookRegistry = config.webhooks;
|
|
3082
3053
|
let hasLoggedStartup = false;
|
|
3083
3054
|
return {
|
|
3084
3055
|
async handler(event) {
|
|
3085
3056
|
if (!hasLoggedStartup) {
|
|
3086
|
-
printStartupLog(config, tools
|
|
3057
|
+
printStartupLog(config, tools);
|
|
3087
3058
|
hasLoggedStartup = true;
|
|
3088
3059
|
}
|
|
3089
3060
|
try {
|
|
@@ -3628,12 +3599,7 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
|
|
|
3628
3599
|
return createResponse(200, state.getHealthStatus(), headers);
|
|
3629
3600
|
}
|
|
3630
3601
|
if (path2 === "/config" && method === "GET") {
|
|
3631
|
-
|
|
3632
|
-
config.metadata.name,
|
|
3633
|
-
config.metadata.version
|
|
3634
|
-
);
|
|
3635
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
3636
|
-
return createResponse(200, serializedConfig, headers);
|
|
3602
|
+
return createResponse(200, serializeConfig(config), headers);
|
|
3637
3603
|
}
|
|
3638
3604
|
if (path2 === "/mcp" && method === "POST") {
|
|
3639
3605
|
let body;
|
|
@@ -3851,9 +3817,11 @@ console.log("[skedyul-node/server] All imports complete");
|
|
|
3851
3817
|
console.log("[skedyul-node/server] Installing context logger...");
|
|
3852
3818
|
installContextLogger();
|
|
3853
3819
|
console.log("[skedyul-node/server] Context logger installed");
|
|
3854
|
-
function createSkedyulServer(config
|
|
3820
|
+
function createSkedyulServer(config) {
|
|
3855
3821
|
console.log("[createSkedyulServer] Step 1: mergeRuntimeEnv()");
|
|
3856
3822
|
mergeRuntimeEnv();
|
|
3823
|
+
const registry = config.tools;
|
|
3824
|
+
const webhookRegistry = config.webhooks;
|
|
3857
3825
|
console.log("[createSkedyulServer] Step 2: coreApi setup");
|
|
3858
3826
|
if (config.coreApi?.service) {
|
|
3859
3827
|
coreApiService.register(config.coreApi.service);
|
|
@@ -3865,7 +3833,7 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
3865
3833
|
const tools = buildToolMetadata(registry);
|
|
3866
3834
|
console.log("[createSkedyulServer] Step 3 done, tools:", tools.length);
|
|
3867
3835
|
const toolNames = Object.values(registry).map((tool) => tool.name);
|
|
3868
|
-
const runtimeLabel = config.computeLayer;
|
|
3836
|
+
const runtimeLabel = config.computeLayer ?? "serverless";
|
|
3869
3837
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
3870
3838
|
const ttlExtendSeconds = config.ttlExtendSeconds ?? parseNumberEnv(process.env.MCP_TTL_EXTEND) ?? 3600;
|
|
3871
3839
|
console.log("[createSkedyulServer] Step 4: createRequestState()");
|
|
@@ -3878,8 +3846,8 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
3878
3846
|
console.log("[createSkedyulServer] Step 4 done");
|
|
3879
3847
|
console.log("[createSkedyulServer] Step 5: new McpServer()");
|
|
3880
3848
|
const mcpServer = new McpServer({
|
|
3881
|
-
name: config.
|
|
3882
|
-
version: config.
|
|
3849
|
+
name: config.name,
|
|
3850
|
+
version: config.version ?? "0.0.0"
|
|
3883
3851
|
});
|
|
3884
3852
|
console.log("[createSkedyulServer] Step 5 done");
|
|
3885
3853
|
const dedicatedShutdown = () => {
|
|
@@ -4007,13 +3975,11 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4007
3975
|
tools,
|
|
4008
3976
|
callTool,
|
|
4009
3977
|
state,
|
|
4010
|
-
mcpServer
|
|
4011
|
-
registry,
|
|
4012
|
-
webhookRegistry
|
|
3978
|
+
mcpServer
|
|
4013
3979
|
);
|
|
4014
3980
|
}
|
|
4015
3981
|
console.log("[createSkedyulServer] Creating serverless instance");
|
|
4016
|
-
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3982
|
+
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer);
|
|
4017
3983
|
console.log("[createSkedyulServer] Serverless instance created successfully");
|
|
4018
3984
|
return serverlessInstance;
|
|
4019
3985
|
}
|
|
@@ -4334,7 +4300,6 @@ export {
|
|
|
4334
4300
|
communicationChannel,
|
|
4335
4301
|
configure,
|
|
4336
4302
|
createContextLogger,
|
|
4337
|
-
createMinimalConfig,
|
|
4338
4303
|
createServerHookContext,
|
|
4339
4304
|
createToolCallContext,
|
|
4340
4305
|
createWebhookContext,
|
|
@@ -4361,7 +4326,6 @@ export {
|
|
|
4361
4326
|
isWorkflowDependency,
|
|
4362
4327
|
loadConfig,
|
|
4363
4328
|
report,
|
|
4364
|
-
resolveConfig,
|
|
4365
4329
|
resource,
|
|
4366
4330
|
runWithConfig,
|
|
4367
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,12 +2672,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
2700
2672
|
return;
|
|
2701
2673
|
}
|
|
2702
2674
|
if (pathname === "/config" && req.method === "GET") {
|
|
2703
|
-
|
|
2704
|
-
config.metadata.name,
|
|
2705
|
-
config.metadata.version
|
|
2706
|
-
);
|
|
2707
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
2708
|
-
sendJSON(res, 200, serializedConfig);
|
|
2675
|
+
sendJSON(res, 200, serializeConfig(config));
|
|
2709
2676
|
return;
|
|
2710
2677
|
}
|
|
2711
2678
|
if (pathname.startsWith("/webhooks/") && webhookRegistry) {
|
|
@@ -3234,7 +3201,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3234
3201
|
const finalPort = listenPort ?? port;
|
|
3235
3202
|
return new Promise((resolve2, reject) => {
|
|
3236
3203
|
httpServer.listen(finalPort, () => {
|
|
3237
|
-
printStartupLog(config, tools,
|
|
3204
|
+
printStartupLog(config, tools, finalPort);
|
|
3238
3205
|
resolve2();
|
|
3239
3206
|
});
|
|
3240
3207
|
httpServer.once("error", reject);
|
|
@@ -3245,13 +3212,15 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
|
|
|
3245
3212
|
}
|
|
3246
3213
|
|
|
3247
3214
|
// src/server/serverless.ts
|
|
3248
|
-
function createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
3215
|
+
function createServerlessInstance(config, tools, callTool, state, mcpServer) {
|
|
3249
3216
|
const headers = getDefaultHeaders(config.cors);
|
|
3217
|
+
const registry = config.tools;
|
|
3218
|
+
const webhookRegistry = config.webhooks;
|
|
3250
3219
|
let hasLoggedStartup = false;
|
|
3251
3220
|
return {
|
|
3252
3221
|
async handler(event) {
|
|
3253
3222
|
if (!hasLoggedStartup) {
|
|
3254
|
-
printStartupLog(config, tools
|
|
3223
|
+
printStartupLog(config, tools);
|
|
3255
3224
|
hasLoggedStartup = true;
|
|
3256
3225
|
}
|
|
3257
3226
|
try {
|
|
@@ -3796,12 +3765,7 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
|
|
|
3796
3765
|
return createResponse(200, state.getHealthStatus(), headers);
|
|
3797
3766
|
}
|
|
3798
3767
|
if (path2 === "/config" && method === "GET") {
|
|
3799
|
-
|
|
3800
|
-
config.metadata.name,
|
|
3801
|
-
config.metadata.version
|
|
3802
|
-
);
|
|
3803
|
-
const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
|
|
3804
|
-
return createResponse(200, serializedConfig, headers);
|
|
3768
|
+
return createResponse(200, serializeConfig(config), headers);
|
|
3805
3769
|
}
|
|
3806
3770
|
if (path2 === "/mcp" && method === "POST") {
|
|
3807
3771
|
let body;
|
|
@@ -4019,9 +3983,11 @@ console.log("[skedyul-node/server] All imports complete");
|
|
|
4019
3983
|
console.log("[skedyul-node/server] Installing context logger...");
|
|
4020
3984
|
installContextLogger();
|
|
4021
3985
|
console.log("[skedyul-node/server] Context logger installed");
|
|
4022
|
-
function createSkedyulServer(config
|
|
3986
|
+
function createSkedyulServer(config) {
|
|
4023
3987
|
console.log("[createSkedyulServer] Step 1: mergeRuntimeEnv()");
|
|
4024
3988
|
mergeRuntimeEnv();
|
|
3989
|
+
const registry = config.tools;
|
|
3990
|
+
const webhookRegistry = config.webhooks;
|
|
4025
3991
|
console.log("[createSkedyulServer] Step 2: coreApi setup");
|
|
4026
3992
|
if (config.coreApi?.service) {
|
|
4027
3993
|
coreApiService.register(config.coreApi.service);
|
|
@@ -4033,7 +3999,7 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4033
3999
|
const tools = buildToolMetadata(registry);
|
|
4034
4000
|
console.log("[createSkedyulServer] Step 3 done, tools:", tools.length);
|
|
4035
4001
|
const toolNames = Object.values(registry).map((tool) => tool.name);
|
|
4036
|
-
const runtimeLabel = config.computeLayer;
|
|
4002
|
+
const runtimeLabel = config.computeLayer ?? "serverless";
|
|
4037
4003
|
const maxRequests = config.maxRequests ?? parseNumberEnv(process.env.MCP_MAX_REQUESTS) ?? null;
|
|
4038
4004
|
const ttlExtendSeconds = config.ttlExtendSeconds ?? parseNumberEnv(process.env.MCP_TTL_EXTEND) ?? 3600;
|
|
4039
4005
|
console.log("[createSkedyulServer] Step 4: createRequestState()");
|
|
@@ -4046,8 +4012,8 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4046
4012
|
console.log("[createSkedyulServer] Step 4 done");
|
|
4047
4013
|
console.log("[createSkedyulServer] Step 5: new McpServer()");
|
|
4048
4014
|
const mcpServer = new import_mcp.McpServer({
|
|
4049
|
-
name: config.
|
|
4050
|
-
version: config.
|
|
4015
|
+
name: config.name,
|
|
4016
|
+
version: config.version ?? "0.0.0"
|
|
4051
4017
|
});
|
|
4052
4018
|
console.log("[createSkedyulServer] Step 5 done");
|
|
4053
4019
|
const dedicatedShutdown = () => {
|
|
@@ -4175,13 +4141,11 @@ function createSkedyulServer(config, registry, webhookRegistry) {
|
|
|
4175
4141
|
tools,
|
|
4176
4142
|
callTool,
|
|
4177
4143
|
state,
|
|
4178
|
-
mcpServer
|
|
4179
|
-
registry,
|
|
4180
|
-
webhookRegistry
|
|
4144
|
+
mcpServer
|
|
4181
4145
|
);
|
|
4182
4146
|
}
|
|
4183
4147
|
console.log("[createSkedyulServer] Creating serverless instance");
|
|
4184
|
-
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer
|
|
4148
|
+
const serverlessInstance = createServerlessInstance(config, tools, callTool, state, mcpServer);
|
|
4185
4149
|
console.log("[createSkedyulServer] Serverless instance created successfully");
|
|
4186
4150
|
return serverlessInstance;
|
|
4187
4151
|
}
|
|
@@ -4503,7 +4467,6 @@ var index_default = { z: import_v44.z };
|
|
|
4503
4467
|
communicationChannel,
|
|
4504
4468
|
configure,
|
|
4505
4469
|
createContextLogger,
|
|
4506
|
-
createMinimalConfig,
|
|
4507
4470
|
createServerHookContext,
|
|
4508
4471
|
createToolCallContext,
|
|
4509
4472
|
createWebhookContext,
|
|
@@ -4529,7 +4492,6 @@ var index_default = { z: import_v44.z };
|
|
|
4529
4492
|
isWorkflowDependency,
|
|
4530
4493
|
loadConfig,
|
|
4531
4494
|
report,
|
|
4532
|
-
resolveConfig,
|
|
4533
4495
|
resource,
|
|
4534
4496
|
runWithConfig,
|
|
4535
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';
|