skedyul 1.2.17 → 1.2.19

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
@@ -2951,6 +2951,64 @@ function printStartupLog(config, tools, webhookRegistry, port) {
2951
2951
  console.log("");
2952
2952
  }
2953
2953
 
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) : [];
2994
+ return {
2995
+ name: config.name,
2996
+ version: config.version,
2997
+ description: config.description,
2998
+ computeLayer: config.computeLayer,
2999
+ tools,
3000
+ webhooks,
3001
+ provision,
3002
+ agents: config.agents
3003
+ };
3004
+ }
3005
+ function createMinimalConfig(name, version) {
3006
+ return {
3007
+ name,
3008
+ version
3009
+ };
3010
+ }
3011
+
2954
3012
  // src/server/dedicated.ts
2955
3013
  function createDedicatedServerInstance(config, tools, callTool, state, mcpServer, registry, webhookRegistry) {
2956
3014
  const port = getListeningPort(config);
@@ -2970,23 +3028,19 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
2970
3028
  return;
2971
3029
  }
2972
3030
  if (pathname === "/config" && req.method === "GET") {
2973
- sendJSON(res, 200, {
2974
- name: config.metadata.name,
2975
- version: config.metadata.version,
2976
- computeLayer: config.computeLayer,
2977
- tools: Object.entries(registry).map(([key, tool]) => ({
2978
- name: tool.name || key,
2979
- description: tool.description,
2980
- timeout: tool.timeout,
2981
- retries: tool.retries,
2982
- triggers: tool.triggers
2983
- })),
2984
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
2985
- name: w.name,
2986
- description: w.description,
2987
- methods: w.methods
2988
- })) : []
2989
- });
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);
2990
3044
  return;
2991
3045
  }
2992
3046
  if (pathname.startsWith("/webhooks/") && webhookRegistry) {
@@ -4077,23 +4131,19 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
4077
4131
  return createResponse(200, state.getHealthStatus(), headers);
4078
4132
  }
4079
4133
  if (path14 === "/config" && method === "GET") {
4080
- return createResponse(200, {
4081
- name: config.metadata.name,
4082
- version: config.metadata.version,
4083
- computeLayer: config.computeLayer,
4084
- tools: Object.entries(registry).map(([key, tool]) => ({
4085
- name: tool.name || key,
4086
- description: tool.description,
4087
- timeout: tool.timeout,
4088
- retries: tool.retries,
4089
- triggers: tool.triggers
4090
- })),
4091
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
4092
- name: w.name,
4093
- description: w.description,
4094
- methods: w.methods
4095
- })) : []
4096
- }, headers);
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);
4097
4147
  }
4098
4148
  if (path14 === "/mcp" && method === "POST") {
4099
4149
  let body;
@@ -13,4 +13,5 @@ export type { InstallConfig, ProvisionConfig, BuildConfig, SkedyulConfig, Serial
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';
16
17
  export { getAllEnvKeys, getRequiredInstallEnvKeys } from './utils';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Config resolution utilities.
3
+ *
4
+ * This module provides functions to resolve dynamic imports in SkedyulConfig
5
+ * and convert it to a serializable format for the /config endpoint.
6
+ */
7
+ import type { SkedyulConfig, SerializableSkedyulConfig } from './app-config';
8
+ import type { ToolRegistry, WebhookRegistry } from '../types';
9
+ /**
10
+ * Resolves all dynamic imports in a SkedyulConfig and returns a serializable version.
11
+ *
12
+ * This function:
13
+ * 1. Resolves dynamic imports for tools, webhooks, provision, and install
14
+ * 2. Serializes tool and webhook registries to metadata arrays
15
+ * 3. Returns a plain object suitable for JSON serialization
16
+ *
17
+ * @param config - The original SkedyulConfig (may contain dynamic imports)
18
+ * @param registry - The resolved tool registry (already loaded by mcp_server.ts)
19
+ * @param webhookRegistry - The resolved webhook registry (if any)
20
+ * @returns A fully resolved and serializable config
21
+ */
22
+ export declare function resolveConfig(config: SkedyulConfig, registry: ToolRegistry, webhookRegistry?: WebhookRegistry): Promise<SerializableSkedyulConfig>;
23
+ /**
24
+ * Creates a minimal SkedyulConfig from server metadata.
25
+ * Used as a fallback when appConfig is not provided.
26
+ */
27
+ export declare function createMinimalConfig(name: string, version?: string): SkedyulConfig;
@@ -769,6 +769,64 @@ function printStartupLog(config, tools, webhookRegistry, port) {
769
769
  console.log("");
770
770
  }
771
771
 
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) : [];
812
+ return {
813
+ name: config.name,
814
+ version: config.version,
815
+ description: config.description,
816
+ computeLayer: config.computeLayer,
817
+ tools,
818
+ webhooks,
819
+ provision,
820
+ agents: config.agents
821
+ };
822
+ }
823
+ function createMinimalConfig(name, version) {
824
+ return {
825
+ name,
826
+ version
827
+ };
828
+ }
829
+
772
830
  // src/server/dedicated.ts
773
831
  function createDedicatedServerInstance(config, tools, callTool, state, mcpServer, registry, webhookRegistry) {
774
832
  const port = getListeningPort(config);
@@ -788,23 +846,19 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
788
846
  return;
789
847
  }
790
848
  if (pathname === "/config" && req.method === "GET") {
791
- sendJSON(res, 200, {
792
- name: config.metadata.name,
793
- version: config.metadata.version,
794
- computeLayer: config.computeLayer,
795
- tools: Object.entries(registry).map(([key, tool]) => ({
796
- name: tool.name || key,
797
- description: tool.description,
798
- timeout: tool.timeout,
799
- retries: tool.retries,
800
- triggers: tool.triggers
801
- })),
802
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
803
- name: w.name,
804
- description: w.description,
805
- methods: w.methods
806
- })) : []
807
- });
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);
808
862
  return;
809
863
  }
810
864
  if (pathname.startsWith("/webhooks/") && webhookRegistry) {
@@ -1895,23 +1949,19 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
1895
1949
  return createResponse(200, state.getHealthStatus(), headers);
1896
1950
  }
1897
1951
  if (path === "/config" && method === "GET") {
1898
- return createResponse(200, {
1899
- name: config.metadata.name,
1900
- version: config.metadata.version,
1901
- computeLayer: config.computeLayer,
1902
- tools: Object.entries(registry).map(([key, tool]) => ({
1903
- name: tool.name || key,
1904
- description: tool.description,
1905
- timeout: tool.timeout,
1906
- retries: tool.retries,
1907
- triggers: tool.triggers
1908
- })),
1909
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
1910
- name: w.name,
1911
- description: w.description,
1912
- methods: w.methods
1913
- })) : []
1914
- }, headers);
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);
1915
1965
  }
1916
1966
  if (path === "/mcp" && method === "POST") {
1917
1967
  let body;
@@ -2455,6 +2455,64 @@ function printStartupLog(config, tools, webhookRegistry, port) {
2455
2455
  console.log("");
2456
2456
  }
2457
2457
 
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) : [];
2498
+ return {
2499
+ name: config.name,
2500
+ version: config.version,
2501
+ description: config.description,
2502
+ computeLayer: config.computeLayer,
2503
+ tools,
2504
+ webhooks,
2505
+ provision,
2506
+ agents: config.agents
2507
+ };
2508
+ }
2509
+ function createMinimalConfig(name, version) {
2510
+ return {
2511
+ name,
2512
+ version
2513
+ };
2514
+ }
2515
+
2458
2516
  // src/server/dedicated.ts
2459
2517
  function createDedicatedServerInstance(config, tools, callTool, state, mcpServer, registry, webhookRegistry) {
2460
2518
  const port = getListeningPort(config);
@@ -2474,23 +2532,19 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
2474
2532
  return;
2475
2533
  }
2476
2534
  if (pathname === "/config" && req.method === "GET") {
2477
- sendJSON(res, 200, {
2478
- name: config.metadata.name,
2479
- version: config.metadata.version,
2480
- computeLayer: config.computeLayer,
2481
- tools: Object.entries(registry).map(([key, tool]) => ({
2482
- name: tool.name || key,
2483
- description: tool.description,
2484
- timeout: tool.timeout,
2485
- retries: tool.retries,
2486
- triggers: tool.triggers
2487
- })),
2488
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
2489
- name: w.name,
2490
- description: w.description,
2491
- methods: w.methods
2492
- })) : []
2493
- });
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);
2494
2548
  return;
2495
2549
  }
2496
2550
  if (pathname.startsWith("/webhooks/") && webhookRegistry) {
@@ -3581,23 +3635,19 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
3581
3635
  return createResponse(200, state.getHealthStatus(), headers);
3582
3636
  }
3583
3637
  if (path2 === "/config" && method === "GET") {
3584
- return createResponse(200, {
3585
- name: config.metadata.name,
3586
- version: config.metadata.version,
3587
- computeLayer: config.computeLayer,
3588
- tools: Object.entries(registry).map(([key, tool]) => ({
3589
- name: tool.name || key,
3590
- description: tool.description,
3591
- timeout: tool.timeout,
3592
- retries: tool.retries,
3593
- triggers: tool.triggers
3594
- })),
3595
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
3596
- name: w.name,
3597
- description: w.description,
3598
- methods: w.methods
3599
- })) : []
3600
- }, headers);
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);
3601
3651
  }
3602
3652
  if (path2 === "/mcp" && method === "POST") {
3603
3653
  let body;
@@ -4298,6 +4348,7 @@ export {
4298
4348
  communicationChannel,
4299
4349
  configure,
4300
4350
  createContextLogger,
4351
+ createMinimalConfig,
4301
4352
  createServerHookContext,
4302
4353
  createToolCallContext,
4303
4354
  createWebhookContext,
@@ -4324,6 +4375,7 @@ export {
4324
4375
  isWorkflowDependency,
4325
4376
  loadConfig,
4326
4377
  report,
4378
+ resolveConfig,
4327
4379
  resource,
4328
4380
  runWithConfig,
4329
4381
  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, CONFIG_FILE_NAMES, getAllEnvKeys, getRequiredInstallEnvKeys, } from './config';
18
+ export { defineConfig, defineModel, defineChannel, definePage, defineWorkflow, defineAgent, defineEnv, defineNavigation, loadConfig, validateConfig, resolveConfig, createMinimalConfig, 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,6 +136,7 @@ __export(index_exports, {
136
136
  communicationChannel: () => communicationChannel,
137
137
  configure: () => configure,
138
138
  createContextLogger: () => createContextLogger,
139
+ createMinimalConfig: () => createMinimalConfig,
139
140
  createServerHookContext: () => createServerHookContext,
140
141
  createToolCallContext: () => createToolCallContext,
141
142
  createWebhookContext: () => createWebhookContext,
@@ -162,6 +163,7 @@ __export(index_exports, {
162
163
  isWorkflowDependency: () => isWorkflowDependency,
163
164
  loadConfig: () => loadConfig,
164
165
  report: () => report,
166
+ resolveConfig: () => resolveConfig,
165
167
  resource: () => resource,
166
168
  runWithConfig: () => runWithConfig,
167
169
  safeParseConfig: () => safeParseConfig,
@@ -2621,6 +2623,64 @@ function printStartupLog(config, tools, webhookRegistry, port) {
2621
2623
  console.log("");
2622
2624
  }
2623
2625
 
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) : [];
2666
+ return {
2667
+ name: config.name,
2668
+ version: config.version,
2669
+ description: config.description,
2670
+ computeLayer: config.computeLayer,
2671
+ tools,
2672
+ webhooks,
2673
+ provision,
2674
+ agents: config.agents
2675
+ };
2676
+ }
2677
+ function createMinimalConfig(name, version) {
2678
+ return {
2679
+ name,
2680
+ version
2681
+ };
2682
+ }
2683
+
2624
2684
  // src/server/dedicated.ts
2625
2685
  function createDedicatedServerInstance(config, tools, callTool, state, mcpServer, registry, webhookRegistry) {
2626
2686
  const port = getListeningPort(config);
@@ -2640,23 +2700,19 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
2640
2700
  return;
2641
2701
  }
2642
2702
  if (pathname === "/config" && req.method === "GET") {
2643
- sendJSON(res, 200, {
2644
- name: config.metadata.name,
2645
- version: config.metadata.version,
2646
- computeLayer: config.computeLayer,
2647
- tools: Object.entries(registry).map(([key, tool]) => ({
2648
- name: tool.name || key,
2649
- description: tool.description,
2650
- timeout: tool.timeout,
2651
- retries: tool.retries,
2652
- triggers: tool.triggers
2653
- })),
2654
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
2655
- name: w.name,
2656
- description: w.description,
2657
- methods: w.methods
2658
- })) : []
2659
- });
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);
2660
2716
  return;
2661
2717
  }
2662
2718
  if (pathname.startsWith("/webhooks/") && webhookRegistry) {
@@ -3747,23 +3803,19 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
3747
3803
  return createResponse(200, state.getHealthStatus(), headers);
3748
3804
  }
3749
3805
  if (path2 === "/config" && method === "GET") {
3750
- return createResponse(200, {
3751
- name: config.metadata.name,
3752
- version: config.metadata.version,
3753
- computeLayer: config.computeLayer,
3754
- tools: Object.entries(registry).map(([key, tool]) => ({
3755
- name: tool.name || key,
3756
- description: tool.description,
3757
- timeout: tool.timeout,
3758
- retries: tool.retries,
3759
- triggers: tool.triggers
3760
- })),
3761
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
3762
- name: w.name,
3763
- description: w.description,
3764
- methods: w.methods
3765
- })) : []
3766
- }, headers);
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);
3767
3819
  }
3768
3820
  if (path2 === "/mcp" && method === "POST") {
3769
3821
  let body;
@@ -4465,6 +4517,7 @@ var index_default = { z: import_v44.z };
4465
4517
  communicationChannel,
4466
4518
  configure,
4467
4519
  createContextLogger,
4520
+ createMinimalConfig,
4468
4521
  createServerHookContext,
4469
4522
  createToolCallContext,
4470
4523
  createWebhookContext,
@@ -4490,6 +4543,7 @@ var index_default = { z: import_v44.z };
4490
4543
  isWorkflowDependency,
4491
4544
  loadConfig,
4492
4545
  report,
4546
+ resolveConfig,
4493
4547
  resource,
4494
4548
  runWithConfig,
4495
4549
  safeParseConfig,
package/dist/server.js CHANGED
@@ -769,6 +769,64 @@ function printStartupLog(config, tools, webhookRegistry, port) {
769
769
  console.log("");
770
770
  }
771
771
 
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) : [];
812
+ return {
813
+ name: config.name,
814
+ version: config.version,
815
+ description: config.description,
816
+ computeLayer: config.computeLayer,
817
+ tools,
818
+ webhooks,
819
+ provision,
820
+ agents: config.agents
821
+ };
822
+ }
823
+ function createMinimalConfig(name, version) {
824
+ return {
825
+ name,
826
+ version
827
+ };
828
+ }
829
+
772
830
  // src/server/dedicated.ts
773
831
  function createDedicatedServerInstance(config, tools, callTool, state, mcpServer, registry, webhookRegistry) {
774
832
  const port = getListeningPort(config);
@@ -788,23 +846,19 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
788
846
  return;
789
847
  }
790
848
  if (pathname === "/config" && req.method === "GET") {
791
- sendJSON(res, 200, {
792
- name: config.metadata.name,
793
- version: config.metadata.version,
794
- computeLayer: config.computeLayer,
795
- tools: Object.entries(registry).map(([key, tool]) => ({
796
- name: tool.name || key,
797
- description: tool.description,
798
- timeout: tool.timeout,
799
- retries: tool.retries,
800
- triggers: tool.triggers
801
- })),
802
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
803
- name: w.name,
804
- description: w.description,
805
- methods: w.methods
806
- })) : []
807
- });
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);
808
862
  return;
809
863
  }
810
864
  if (pathname.startsWith("/webhooks/") && webhookRegistry) {
@@ -1895,23 +1949,19 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
1895
1949
  return createResponse(200, state.getHealthStatus(), headers);
1896
1950
  }
1897
1951
  if (path === "/config" && method === "GET") {
1898
- return createResponse(200, {
1899
- name: config.metadata.name,
1900
- version: config.metadata.version,
1901
- computeLayer: config.computeLayer,
1902
- tools: Object.entries(registry).map(([key, tool]) => ({
1903
- name: tool.name || key,
1904
- description: tool.description,
1905
- timeout: tool.timeout,
1906
- retries: tool.retries,
1907
- triggers: tool.triggers
1908
- })),
1909
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
1910
- name: w.name,
1911
- description: w.description,
1912
- methods: w.methods
1913
- })) : []
1914
- }, headers);
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);
1915
1965
  }
1916
1966
  if (path === "/mcp" && method === "POST") {
1917
1967
  let body;
@@ -708,6 +708,64 @@ function printStartupLog(config, tools, webhookRegistry, port) {
708
708
  console.log("");
709
709
  }
710
710
 
711
+ // src/config/resolve.ts
712
+ async function resolveDynamicImport(value) {
713
+ if (value === void 0 || value === null) {
714
+ return void 0;
715
+ }
716
+ if (value instanceof Promise) {
717
+ const resolved = await value;
718
+ if (resolved && typeof resolved === "object" && "default" in resolved) {
719
+ return resolved.default;
720
+ }
721
+ return resolved;
722
+ }
723
+ return value;
724
+ }
725
+ function serializeTools(registry) {
726
+ return Object.entries(registry).map(([key, tool]) => ({
727
+ name: tool.name || key,
728
+ displayName: tool.label,
729
+ description: tool.description,
730
+ timeout: tool.timeout,
731
+ retries: tool.retries
732
+ }));
733
+ }
734
+ function serializeWebhooks(registry) {
735
+ return Object.values(registry).map((webhook) => ({
736
+ name: webhook.name,
737
+ description: webhook.description,
738
+ methods: webhook.methods ?? ["POST"],
739
+ type: webhook.type ?? "WEBHOOK"
740
+ }));
741
+ }
742
+ async function resolveConfig(config, registry, webhookRegistry) {
743
+ const provision = await resolveDynamicImport(
744
+ config.provision
745
+ );
746
+ const install = await resolveDynamicImport(
747
+ config.install
748
+ );
749
+ const tools = serializeTools(registry);
750
+ const webhooks = webhookRegistry ? serializeWebhooks(webhookRegistry) : [];
751
+ return {
752
+ name: config.name,
753
+ version: config.version,
754
+ description: config.description,
755
+ computeLayer: config.computeLayer,
756
+ tools,
757
+ webhooks,
758
+ provision,
759
+ agents: config.agents
760
+ };
761
+ }
762
+ function createMinimalConfig(name, version) {
763
+ return {
764
+ name,
765
+ version
766
+ };
767
+ }
768
+
711
769
  // src/server/dedicated.ts
712
770
  function createDedicatedServerInstance(config, tools, callTool, state, mcpServer, registry, webhookRegistry) {
713
771
  const port = getListeningPort(config);
@@ -727,23 +785,19 @@ function createDedicatedServerInstance(config, tools, callTool, state, mcpServer
727
785
  return;
728
786
  }
729
787
  if (pathname === "/config" && req.method === "GET") {
730
- sendJSON(res, 200, {
731
- name: config.metadata.name,
732
- version: config.metadata.version,
733
- computeLayer: config.computeLayer,
734
- tools: Object.entries(registry).map(([key, tool]) => ({
735
- name: tool.name || key,
736
- description: tool.description,
737
- timeout: tool.timeout,
738
- retries: tool.retries,
739
- triggers: tool.triggers
740
- })),
741
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
742
- name: w.name,
743
- description: w.description,
744
- methods: w.methods
745
- })) : []
746
- });
788
+ let appConfig = config.appConfig;
789
+ if (!appConfig && config.appConfigLoader) {
790
+ const loaded = await config.appConfigLoader();
791
+ appConfig = loaded.default;
792
+ }
793
+ if (!appConfig) {
794
+ appConfig = createMinimalConfig(
795
+ config.metadata.name,
796
+ config.metadata.version
797
+ );
798
+ }
799
+ const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
800
+ sendJSON(res, 200, serializedConfig);
747
801
  return;
748
802
  }
749
803
  if (pathname.startsWith("/webhooks/") && webhookRegistry) {
@@ -1834,23 +1888,19 @@ function createServerlessInstance(config, tools, callTool, state, mcpServer, reg
1834
1888
  return createResponse(200, state.getHealthStatus(), headers);
1835
1889
  }
1836
1890
  if (path === "/config" && method === "GET") {
1837
- return createResponse(200, {
1838
- name: config.metadata.name,
1839
- version: config.metadata.version,
1840
- computeLayer: config.computeLayer,
1841
- tools: Object.entries(registry).map(([key, tool]) => ({
1842
- name: tool.name || key,
1843
- description: tool.description,
1844
- timeout: tool.timeout,
1845
- retries: tool.retries,
1846
- triggers: tool.triggers
1847
- })),
1848
- webhooks: webhookRegistry ? Object.values(webhookRegistry).map((w) => ({
1849
- name: w.name,
1850
- description: w.description,
1851
- methods: w.methods
1852
- })) : []
1853
- }, headers);
1891
+ let appConfig = config.appConfig;
1892
+ if (!appConfig && config.appConfigLoader) {
1893
+ const loaded = await config.appConfigLoader();
1894
+ appConfig = loaded.default;
1895
+ }
1896
+ if (!appConfig) {
1897
+ appConfig = createMinimalConfig(
1898
+ config.metadata.name,
1899
+ config.metadata.version
1900
+ );
1901
+ }
1902
+ const serializedConfig = await resolveConfig(appConfig, registry, webhookRegistry);
1903
+ return createResponse(200, serializedConfig, headers);
1854
1904
  }
1855
1905
  if (path === "/mcp" && method === "POST") {
1856
1906
  let body;
@@ -2,6 +2,7 @@ import type { CoreApiConfig } from '../core/types';
2
2
  import type { ServerHooks } from './handlers';
3
3
  import type { APIGatewayProxyEvent, APIGatewayProxyResult } from './aws';
4
4
  import type { ComputeLayer } from '../config/types/compute';
5
+ import type { SkedyulConfig } from '../config/app-config';
5
6
  export interface HealthStatus {
6
7
  status: 'running';
7
8
  requests: number;
@@ -32,6 +33,16 @@ export interface SkedyulServerConfig {
32
33
  coreApi?: CoreApiConfig;
33
34
  /** Lifecycle hooks for install and provision handlers */
34
35
  hooks?: ServerHooks;
36
+ /** Original app config from skedyul.config.ts for /config endpoint serialization */
37
+ appConfig?: SkedyulConfig;
38
+ /**
39
+ * Lazy loader for app config - use this instead of appConfig to avoid bundling
40
+ * provision/install configs at build time. The loader is called only when the
41
+ * /config endpoint is accessed.
42
+ */
43
+ appConfigLoader?: () => Promise<{
44
+ default: SkedyulConfig;
45
+ }>;
35
46
  }
36
47
  export interface DedicatedServerInstance {
37
48
  listen(port?: number): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skedyul",
3
- "version": "1.2.17",
3
+ "version": "1.2.19",
4
4
  "description": "The Skedyul SDK for Node.js",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",