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.
@@ -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,12 +2506,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
2532
2506
  return;
2533
2507
  }
2534
2508
  if (pathname === "/config" && req.method === "GET") {
2535
- const appConfig = config.appConfig ?? createMinimalConfig(
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, webhookRegistry, finalPort);
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, registry, webhookRegistry) {
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, webhookRegistry);
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
- const appConfig = config.appConfig ?? createMinimalConfig(
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, registry, webhookRegistry) {
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.metadata.name,
3882
- version: config.metadata.version
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, registry, webhookRegistry);
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, 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,12 +2672,7 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
2700
2672
  return;
2701
2673
  }
2702
2674
  if (pathname === "/config" && req.method === "GET") {
2703
- const appConfig = config.appConfig ?? createMinimalConfig(
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, webhookRegistry, finalPort);
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, registry, webhookRegistry) {
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, webhookRegistry);
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
- const appConfig = config.appConfig ?? createMinimalConfig(
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, registry, webhookRegistry) {
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.metadata.name,
4050
- version: config.metadata.version
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, registry, webhookRegistry);
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 { 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';