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.
@@ -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, webhookRegistry, port) {
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.metadata.name, 49)}\u2551`);
2415
- console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.metadata.version, 49)}\u2551`);
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/resolve.ts
2459
- async function resolveDynamicImport(value) {
2460
- if (value === void 0 || value === null) {
2461
- return void 0;
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
- webhooks,
2505
- provision,
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 createMinimalConfig(name, version) {
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, registry, webhookRegistry) {
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
- let appConfig = config.appConfig;
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, webhookRegistry, finalPort);
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, registry, webhookRegistry) {
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, webhookRegistry);
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
- let appConfig = config.appConfig;
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, registry, webhookRegistry) {
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.metadata.name,
3896
- version: config.metadata.version
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, registry, webhookRegistry);
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, resolveConfig, createMinimalConfig, CONFIG_FILE_NAMES, getAllEnvKeys, getRequiredInstallEnvKeys, } from './config';
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, webhookRegistry, port) {
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.metadata.name, 49)}\u2551`);
2583
- console.log(`\u2551 \u{1F3F7}\uFE0F Version: ${padEnd(config.metadata.version, 49)}\u2551`);
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/resolve.ts
2627
- async function resolveDynamicImport(value) {
2628
- if (value === void 0 || value === null) {
2629
- return void 0;
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
- webhooks,
2673
- provision,
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 createMinimalConfig(name, version) {
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, registry, webhookRegistry) {
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
- let appConfig = config.appConfig;
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, webhookRegistry, finalPort);
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, registry, webhookRegistry) {
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, webhookRegistry);
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
- let appConfig = config.appConfig;
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, registry, webhookRegistry) {
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.metadata.name,
4064
- version: config.metadata.version
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, registry, webhookRegistry);
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 { SkedyulServerConfig, SkedyulServerInstance, ToolCallResponse, ToolMetadata, ToolRegistry, WebhookRegistry } from '../types';
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: SkedyulServerConfig, tools: ToolMetadata[], callTool: (nameRaw: unknown, argsRaw: unknown) => Promise<ToolCallResponse>, state: RequestState, mcpServer: McpServer, registry: ToolRegistry, webhookRegistry?: WebhookRegistry): SkedyulServerInstance;
8
+ export declare function createDedicatedServerInstance(config: RuntimeSkedyulConfig, tools: ToolMetadata[], callTool: (nameRaw: unknown, argsRaw: unknown) => Promise<ToolCallResponse>, state: RequestState, mcpServer: McpServer): SkedyulServerInstance;
@@ -1,4 +1,5 @@
1
- import type { DedicatedServerInstance, ServerlessServerInstance, SkedyulServerConfig, SkedyulServerInstance, ToolRegistry, WebhookRegistry } from '../types';
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
- export declare function createSkedyulServer(config: SkedyulServerConfig & {
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
- }, registry: ToolRegistry, webhookRegistry?: WebhookRegistry): DedicatedServerInstance;
14
- export declare function createSkedyulServer(config: SkedyulServerConfig & {
22
+ }): DedicatedServerInstance;
23
+ export declare function createSkedyulServer(config: RuntimeSkedyulConfig & {
15
24
  computeLayer: 'serverless';
16
- }, registry: ToolRegistry, webhookRegistry?: WebhookRegistry): ServerlessServerInstance;
17
- export declare function createSkedyulServer(config: SkedyulServerConfig, registry: ToolRegistry, webhookRegistry?: WebhookRegistry): SkedyulServerInstance;
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 { SkedyulServerConfig, SkedyulServerInstance, ToolCallResponse, ToolMetadata, ToolRegistry, WebhookRegistry } from '../types';
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: SkedyulServerConfig, tools: ToolMetadata[], callTool: (nameRaw: unknown, argsRaw: unknown) => Promise<ToolCallResponse>, state: RequestState, mcpServer: McpServer, registry: ToolRegistry, webhookRegistry?: WebhookRegistry): SkedyulServerInstance;
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 { SkedyulServerConfig, ToolMetadata, WebhookRegistry } from '../types';
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: SkedyulServerConfig, tools: ToolMetadata[], webhookRegistry?: WebhookRegistry, port?: number): void;
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, CorsOptions, SkedyulServerConfig } from '../../types';
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: SkedyulServerConfig): number;
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';