skedyul 1.2.19 → 1.2.21

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