@mondaydotcomorg/atp-server 0.18.5-rc.0 → 0.19.1

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.
Files changed (43) hide show
  1. package/dist/aggregator/index.d.ts +14 -0
  2. package/dist/aggregator/index.d.ts.map +1 -1
  3. package/dist/aggregator/index.js +85 -1
  4. package/dist/aggregator/index.js.map +1 -1
  5. package/dist/create-server.d.ts +66 -2
  6. package/dist/create-server.d.ts.map +1 -1
  7. package/dist/create-server.js +203 -33
  8. package/dist/create-server.js.map +1 -1
  9. package/dist/executor/compiler-config.d.ts.map +1 -1
  10. package/dist/executor/compiler-config.js +6 -7
  11. package/dist/executor/compiler-config.js.map +1 -1
  12. package/dist/executor/executor.js.map +1 -1
  13. package/dist/executor/resume-handler.d.ts.map +1 -1
  14. package/dist/executor/resume-handler.js +3 -1
  15. package/dist/executor/resume-handler.js.map +1 -1
  16. package/dist/executor/sandbox-builder.d.ts.map +1 -1
  17. package/dist/executor/sandbox-builder.js +8 -5
  18. package/dist/executor/sandbox-builder.js.map +1 -1
  19. package/dist/explorer/index.d.ts +2 -0
  20. package/dist/explorer/index.d.ts.map +1 -1
  21. package/dist/explorer/index.js +14 -2
  22. package/dist/explorer/index.js.map +1 -1
  23. package/dist/graphql-loader.d.ts +13 -0
  24. package/dist/graphql-loader.d.ts.map +1 -0
  25. package/dist/graphql-loader.js +324 -0
  26. package/dist/graphql-loader.js.map +1 -0
  27. package/dist/http/request-handler.d.ts.map +1 -1
  28. package/dist/http/request-handler.js +7 -1
  29. package/dist/http/request-handler.js.map +1 -1
  30. package/dist/openapi-loader.js +10 -1
  31. package/dist/openapi-loader.js.map +1 -1
  32. package/package.json +7 -6
  33. package/src/aggregator/index.ts +99 -0
  34. package/src/create-server.ts +228 -33
  35. package/src/executor/compiler-config.ts +7 -7
  36. package/src/executor/execution-error-handler.ts +1 -1
  37. package/src/executor/executor.ts +8 -8
  38. package/src/executor/resume-handler.ts +5 -1
  39. package/src/executor/sandbox-builder.ts +52 -48
  40. package/src/explorer/index.ts +17 -2
  41. package/src/graphql-loader.ts +421 -0
  42. package/src/http/request-handler.ts +6 -1
  43. package/src/openapi-loader.ts +9 -1
@@ -44,6 +44,20 @@ export declare class APIAggregator {
44
44
  * @returns TypeScript type string
45
45
  */
46
46
  private jsonSchemaTypeToTS;
47
+ /**
48
+ * Converts a full JSON Schema to TypeScript interface properties
49
+ * @param schema - JSON Schema object
50
+ * @param depth - Current recursion depth (prevents infinite recursion)
51
+ * @returns TypeScript interface properties string
52
+ */
53
+ private jsonSchemaToTSInterface;
54
+ /**
55
+ * Converts any JSON Schema to a TypeScript type expression
56
+ * @param schema - JSON Schema object
57
+ * @param depth - Current recursion depth
58
+ * @returns TypeScript type expression
59
+ */
60
+ private schemaToTSType;
47
61
  /**
48
62
  * Helper to check if a string is a valid JavaScript identifier
49
63
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/aggregator/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,+BAA+B,CAAC;AAEvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;GAGG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,SAAS,CAAmB;IAEpC;;;OAGG;gBACS,SAAS,EAAE,cAAc,EAAE;IAIvC;;;;OAIG;IACG,kBAAkB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpE;;;;OAIG;IACI,oBAAoB,CAAC,OAAO,CAAC,EAAE;QACrC,cAAc,CAAC,EAAE;YAChB,MAAM,EAAE,OAAO,CAAC;YAChB,WAAW,EAAE,OAAO,CAAC;YACrB,YAAY,EAAE,OAAO,CAAC;YACtB,QAAQ,EAAE,OAAO,CAAC;SAClB,CAAC;QACF,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;KACjC,GAAG,MAAM;IAIV;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAoE5B;;;OAGG;IACH,YAAY,IAAI,MAAM,EAAE;CAGxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/aggregator/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,+BAA+B,CAAC;AAEvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;GAGG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,SAAS,CAAmB;IAEpC;;;OAGG;gBACS,SAAS,EAAE,cAAc,EAAE;IAIvC;;;;OAIG;IACG,kBAAkB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpE;;;;OAIG;IACI,oBAAoB,CAAC,OAAO,CAAC,EAAE;QACrC,cAAc,CAAC,EAAE;YAChB,MAAM,EAAE,OAAO,CAAC;YAChB,WAAW,EAAE,OAAO,CAAC;YACrB,YAAY,EAAE,OAAO,CAAC;YACtB,QAAQ,EAAE,OAAO,CAAC;SAClB,CAAC;QACF,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;KACjC,GAAG,MAAM;IAIV;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAgDtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAoE5B;;;OAGG;IACH,YAAY,IAAI,MAAM,EAAE;CAGxB"}
@@ -64,7 +64,13 @@ export class APIAggregator {
64
64
  }
65
65
  typescript += `}\n`;
66
66
  typescript += `\ninterface ${outputTypeName} {\n`;
67
- typescript += ` [key: string]: unknown;\n`;
67
+ if (func.outputSchema) {
68
+ const outputType = this.jsonSchemaToTSInterface(func.outputSchema);
69
+ typescript += outputType;
70
+ }
71
+ else {
72
+ typescript += ` [key: string]: unknown;\n`;
73
+ }
68
74
  typescript += `}\n`;
69
75
  return typescript;
70
76
  }
@@ -90,6 +96,84 @@ export class APIAggregator {
90
96
  return 'unknown';
91
97
  }
92
98
  }
99
+ /**
100
+ * Converts a full JSON Schema to TypeScript interface properties
101
+ * @param schema - JSON Schema object
102
+ * @param depth - Current recursion depth (prevents infinite recursion)
103
+ * @returns TypeScript interface properties string
104
+ */
105
+ jsonSchemaToTSInterface(schema, depth = 0) {
106
+ // Prevent infinite recursion
107
+ if (depth > 3) {
108
+ return ' [key: string]: unknown;\n';
109
+ }
110
+ // Handle array types - for arrays, we treat the interface as array-indexable
111
+ if (schema.type === 'array' && schema.items) {
112
+ const itemType = this.schemaToTSType(schema.items, depth + 1);
113
+ // Generate array-like interface
114
+ return ` [index: number]: ${itemType};\n length: number;\n`;
115
+ }
116
+ // Handle object types with properties
117
+ if (schema.type === 'object' && schema.properties) {
118
+ const required = schema.required || [];
119
+ let result = '';
120
+ for (const [key, value] of Object.entries(schema.properties)) {
121
+ const prop = value;
122
+ const optional = required.includes(key) ? '' : '?';
123
+ const tsType = this.schemaToTSType(prop, depth + 1);
124
+ result += ` ${key}${optional}: ${tsType};\n`;
125
+ }
126
+ return result || ' [key: string]: unknown;\n';
127
+ }
128
+ // Fallback for simple types or unknown structures
129
+ return ' [key: string]: unknown;\n';
130
+ }
131
+ /**
132
+ * Converts any JSON Schema to a TypeScript type expression
133
+ * @param schema - JSON Schema object
134
+ * @param depth - Current recursion depth
135
+ * @returns TypeScript type expression
136
+ */
137
+ schemaToTSType(schema, depth = 0) {
138
+ if (!schema)
139
+ return 'unknown';
140
+ // Prevent infinite recursion
141
+ if (depth > 3) {
142
+ return 'unknown';
143
+ }
144
+ // Handle array types
145
+ if (schema.type === 'array') {
146
+ if (schema.items) {
147
+ const itemType = this.schemaToTSType(schema.items, depth + 1);
148
+ return `${itemType}[]`;
149
+ }
150
+ return 'unknown[]';
151
+ }
152
+ // Handle enum types
153
+ if (schema.enum) {
154
+ return schema.enum.map((v) => `"${v}"`).join(' | ') || 'string';
155
+ }
156
+ // Handle object types with properties
157
+ if (schema.type === 'object' && schema.properties) {
158
+ const required = schema.required || [];
159
+ const props = [];
160
+ for (const [key, value] of Object.entries(schema.properties)) {
161
+ const prop = value;
162
+ const optional = required.includes(key) ? '' : '?';
163
+ const tsType = this.schemaToTSType(prop, depth + 1);
164
+ props.push(`${key}${optional}: ${tsType}`);
165
+ }
166
+ if (props.length > 0) {
167
+ return `{ ${props.join('; ')} }`;
168
+ }
169
+ return 'Record<string, unknown>';
170
+ }
171
+ // Handle simple types
172
+ if (schema.type) {
173
+ return this.jsonSchemaTypeToTS(schema.type);
174
+ }
175
+ return 'unknown';
176
+ }
93
177
  /**
94
178
  * Helper to check if a string is a valid JavaScript identifier
95
179
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/aggregator/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/aggregator/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import type { CacheProvider, AuthProvider, AuditSink, APIGroupConfig, ToolMetadata } from '@mondaydotcomorg/atp-protocol';
3
3
  import type { ICompiler } from '@mondaydotcomorg/atp-compiler';
4
+ import { type DeclarativePolicyConfig, type SecurityPolicy } from '@mondaydotcomorg/atp-provenance';
4
5
  import type { ServerConfig, Middleware, RequestContext } from './core/config.js';
5
6
  import { ClientSessionManager } from './client-sessions.js';
6
7
  import { SandboxExecutor } from './executor/index.js';
@@ -15,6 +16,8 @@ export declare class AgentToolProtocolServer {
15
16
  private httpServer;
16
17
  private responseHeaders;
17
18
  private isRunning;
19
+ private policyRegistry;
20
+ private initPromise;
18
21
  sessionManager?: ClientSessionManager;
19
22
  executor?: SandboxExecutor;
20
23
  validator?: CodeValidator;
@@ -34,10 +37,46 @@ export declare class AgentToolProtocolServer {
34
37
  compiler?: ICompiler;
35
38
  private customLogger?;
36
39
  constructor(config?: ServerConfig);
40
+ /**
41
+ * Add a security policy (programmatic SecurityPolicy object)
42
+ * @example
43
+ * server.addPolicy(preventDataExfiltration);
44
+ */
45
+ addPolicy(policy: SecurityPolicy): this;
46
+ /**
47
+ * Add multiple security policies
48
+ */
49
+ addPolicies(policies: SecurityPolicy[]): this;
50
+ /**
51
+ * Load declarative policies from JSON configuration
52
+ * @example
53
+ * server.loadPolicies([{
54
+ * id: 'block-llm-payments',
55
+ * scope: { toolName: 'payment.*' },
56
+ * rules: [{ action: 'block', conditions: [...] }]
57
+ * }]);
58
+ */
59
+ loadPolicies(configs: DeclarativePolicyConfig[], replace?: boolean): this;
60
+ /**
61
+ * Remove a policy by name
62
+ */
63
+ removePolicy(name: string): this;
64
+ /**
65
+ * Clear all policies
66
+ */
67
+ clearPolicies(): this;
68
+ /**
69
+ * Get all active policies
70
+ */
71
+ getPolicies(): SecurityPolicy[];
37
72
  /**
38
73
  * Register middleware or API groups.
39
- * SECURITY: Cannot be called after server starts to prevent runtime injection attacks.
40
- * @throws {Error} If called after listen() or handler()
74
+ * Can be called before OR after server starts.
75
+ * - Before start: Simply adds to configuration
76
+ * - After start: Dynamically updates running server components
77
+ *
78
+ * Note: Middleware can only be added before server starts.
79
+ * @throws {Error} If trying to add middleware after server has started
41
80
  */
42
81
  use(...items: (Middleware | APIGroupConfig | APIGroupConfig[])[]): this;
43
82
  /**
@@ -84,6 +123,11 @@ export declare class AgentToolProtocolServer {
84
123
  approved: boolean;
85
124
  data?: any;
86
125
  }>): this;
126
+ /**
127
+ * Initialize server components without starting HTTP server.
128
+ * Call this when using handler(), toExpress() or toFastify().
129
+ */
130
+ start(): Promise<void>;
87
131
  listen(port: number): Promise<void>;
88
132
  stop(): Promise<void>;
89
133
  getInfo(): unknown;
@@ -95,9 +139,29 @@ export declare class AgentToolProtocolServer {
95
139
  handleExplore(ctx: RequestContext): Promise<unknown>;
96
140
  handleExecute(ctx: RequestContext): Promise<unknown>;
97
141
  handleResume(ctx: RequestContext, executionId: string): Promise<unknown>;
142
+ /**
143
+ * Update server components with new API groups (internal method)
144
+ * @private
145
+ */
146
+ private updateComponentsWithNewGroups;
147
+ /**
148
+ * Load an OpenAPI spec and add it to the server
149
+ * Works both before and after server starts
150
+ * @param source - URL or file path to OpenAPI spec
151
+ * @param options - OpenAPI loading options
152
+ */
153
+ loadOpenAPI(source: string, options?: any): Promise<this>;
154
+ /**
155
+ * Load a GraphQL spec and add it to the server
156
+ * Works both before and after server starts
157
+ * @param source - URL or file path to GraphQL spec (SDL, introspection JSON, or endpoint URL)
158
+ * @param options - GraphQL loading options
159
+ */
160
+ loadGraphQL(source: string, options?: any): Promise<this>;
98
161
  /**
99
162
  * Get raw Node.js request handler for framework integration
100
163
  * Use this to integrate ATP with Express, Fastify, or any Node.js framework
164
+ * Components will be automatically initialized on first request if not already started.
101
165
  */
102
166
  handler(): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
103
167
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { createServer as createHTTPServer } from 'node:http';
2
2
  import { ProvenanceMode } from '@mondaydotcomorg/atp-protocol';
3
3
  import { log, initializeLogger } from '@mondaydotcomorg/atp-runtime';
4
4
  import { shutdownLogger } from '@mondaydotcomorg/atp-runtime';
5
+ import { DynamicPolicyRegistry, } from '@mondaydotcomorg/atp-provenance';
5
6
  import { MB, HOUR, MINUTE } from './core/config.js';
6
7
  import { ClientSessionManager } from './client-sessions.js';
7
8
  import { SandboxExecutor } from './executor/index.js';
@@ -21,6 +22,7 @@ import { getDefinitions } from './handlers/definitions.handler.js';
21
22
  import { shutdownAudit } from './middleware/audit.js';
22
23
  import { EnvAuthProvider, MemoryCache, OpenTelemetryAuditSink, } from '@mondaydotcomorg/atp-providers';
23
24
  import { APIAggregator } from './aggregator/index.js';
25
+ import { loadGraphQL } from './graphql-loader.js';
24
26
  export class AgentToolProtocolServer {
25
27
  config;
26
28
  middleware = [];
@@ -28,6 +30,8 @@ export class AgentToolProtocolServer {
28
30
  httpServer = null;
29
31
  responseHeaders = new Map();
30
32
  isRunning = false;
33
+ policyRegistry;
34
+ initPromise = null;
31
35
  sessionManager;
32
36
  executor;
33
37
  validator;
@@ -41,13 +45,17 @@ export class AgentToolProtocolServer {
41
45
  compiler;
42
46
  customLogger;
43
47
  constructor(config = {}) {
48
+ // Initialize DynamicPolicyRegistry with policies from config
49
+ const initialPolicies = config.execution?.securityPolicies ?? [];
50
+ this.policyRegistry = new DynamicPolicyRegistry(initialPolicies);
44
51
  this.config = {
45
52
  execution: {
46
53
  timeout: config.execution?.timeout ?? 30000,
47
54
  memory: config.execution?.memory ?? 128 * MB,
48
55
  llmCalls: config.execution?.llmCalls ?? 10,
49
56
  provenanceMode: config.execution?.provenanceMode ?? ProvenanceMode.NONE,
50
- securityPolicies: config.execution?.securityPolicies ?? [],
57
+ // Override policies to use the dynamic registry as the single entry point
58
+ securityPolicies: [this.policyRegistry],
51
59
  },
52
60
  clientInit: {
53
61
  tokenTTL: config.clientInit?.tokenTTL ?? HOUR,
@@ -143,24 +151,102 @@ export class AgentToolProtocolServer {
143
151
  log.info('Custom compiler configured', { type: config.compiler.getType() });
144
152
  }
145
153
  }
154
+ /**
155
+ * Add a security policy (programmatic SecurityPolicy object)
156
+ * @example
157
+ * server.addPolicy(preventDataExfiltration);
158
+ */
159
+ addPolicy(policy) {
160
+ this.policyRegistry.addPolicy(policy);
161
+ log.info('Security policy added', { name: policy.name });
162
+ return this;
163
+ }
164
+ /**
165
+ * Add multiple security policies
166
+ */
167
+ addPolicies(policies) {
168
+ for (const policy of policies) {
169
+ this.policyRegistry.addPolicy(policy);
170
+ }
171
+ log.info('Security policies added', { count: policies.length });
172
+ return this;
173
+ }
174
+ /**
175
+ * Load declarative policies from JSON configuration
176
+ * @example
177
+ * server.loadPolicies([{
178
+ * id: 'block-llm-payments',
179
+ * scope: { toolName: 'payment.*' },
180
+ * rules: [{ action: 'block', conditions: [...] }]
181
+ * }]);
182
+ */
183
+ loadPolicies(configs, replace = false) {
184
+ this.policyRegistry.loadFromConfigs(configs, replace);
185
+ log.info('Declarative policies loaded', { count: configs.length, replace });
186
+ return this;
187
+ }
188
+ /**
189
+ * Remove a policy by name
190
+ */
191
+ removePolicy(name) {
192
+ this.policyRegistry.removePolicy(name);
193
+ log.info('Security policy removed', { name });
194
+ return this;
195
+ }
196
+ /**
197
+ * Clear all policies
198
+ */
199
+ clearPolicies() {
200
+ this.policyRegistry.clear();
201
+ log.info('All security policies cleared');
202
+ return this;
203
+ }
204
+ /**
205
+ * Get all active policies
206
+ */
207
+ getPolicies() {
208
+ return this.policyRegistry.getPolicies();
209
+ }
146
210
  /**
147
211
  * Register middleware or API groups.
148
- * SECURITY: Cannot be called after server starts to prevent runtime injection attacks.
149
- * @throws {Error} If called after listen() or handler()
212
+ * Can be called before OR after server starts.
213
+ * - Before start: Simply adds to configuration
214
+ * - After start: Dynamically updates running server components
215
+ *
216
+ * Note: Middleware can only be added before server starts.
217
+ * @throws {Error} If trying to add middleware after server has started
150
218
  */
151
219
  use(...items) {
152
- if (this.isRunning) {
153
- throw new Error('Cannot add middleware or API groups after server has started. ');
154
- }
220
+ const middlewareItems = [];
221
+ const apiGroupItems = [];
222
+ // Separate middleware from API groups
155
223
  for (const item of items) {
156
224
  if (Array.isArray(item)) {
157
- this.apiGroups.push(...item);
225
+ apiGroupItems.push(...item);
158
226
  }
159
227
  else if (typeof item === 'function') {
160
- this.middleware.push(item);
228
+ middlewareItems.push(item);
161
229
  }
162
230
  else if ('name' in item && 'type' in item) {
163
- this.apiGroups.push(item);
231
+ apiGroupItems.push(item);
232
+ }
233
+ }
234
+ // Middleware can only be added before server starts
235
+ if (middlewareItems.length > 0) {
236
+ if (this.isRunning) {
237
+ throw new Error('Cannot add middleware after server has started. Add middleware before calling listen().');
238
+ }
239
+ this.middleware.push(...middlewareItems);
240
+ }
241
+ // API groups can be added anytime
242
+ if (apiGroupItems.length > 0) {
243
+ if (this.isRunning) {
244
+ // Server is running - update components dynamically
245
+ this.updateComponentsWithNewGroups(apiGroupItems);
246
+ }
247
+ else {
248
+ // Server not started yet - just add to array
249
+ this.apiGroups.push(...apiGroupItems);
164
250
  }
165
251
  }
166
252
  return this;
@@ -220,11 +306,13 @@ export class AgentToolProtocolServer {
220
306
  log.info('Approval handler configured');
221
307
  return this;
222
308
  }
223
- async listen(port) {
224
- if (this.httpServer) {
225
- throw new Error('Server is already running');
226
- }
227
- this.isRunning = true;
309
+ /**
310
+ * Initialize server components without starting HTTP server.
311
+ * Call this when using handler(), toExpress() or toFastify().
312
+ */
313
+ async start() {
314
+ if (this.isRunning)
315
+ return;
228
316
  this.sessionManager = new ClientSessionManager({
229
317
  cache: this.cacheProvider,
230
318
  tokenTTL: this.config.clientInit.tokenTTL,
@@ -250,6 +338,13 @@ export class AgentToolProtocolServer {
250
338
  maxPauseDuration: this.config.executionState.maxPauseDuration,
251
339
  keyPrefix: this.config.executionState.keyPrefix,
252
340
  });
341
+ this.isRunning = true;
342
+ }
343
+ async listen(port) {
344
+ if (this.httpServer) {
345
+ throw new Error('Server is already running');
346
+ }
347
+ await this.start();
253
348
  this.httpServer = createHTTPServer((req, res) => {
254
349
  handleHTTPRequest(req, res, {
255
350
  cacheProvider: this.cacheProvider,
@@ -381,29 +476,97 @@ export class AgentToolProtocolServer {
381
476
  }
382
477
  return await handleResume(ctx, executionId, this.executor, this.stateManager, this.config, this.sessionManager);
383
478
  }
479
+ /**
480
+ * Update server components with new API groups (internal method)
481
+ * @private
482
+ */
483
+ updateComponentsWithNewGroups(groups) {
484
+ // Add to apiGroups array
485
+ this.apiGroups.push(...groups);
486
+ // Update search engine with new groups
487
+ if (this.searchEngine) {
488
+ this.searchEngine = new SearchEngine(this.apiGroups);
489
+ }
490
+ // Update explorer service with new groups
491
+ if (this.explorerService) {
492
+ this.explorerService = new ExplorerService(this.apiGroups);
493
+ }
494
+ // Update executor with new groups
495
+ if (this.executor) {
496
+ this.executor = new SandboxExecutor({
497
+ defaultTimeout: this.config.execution.timeout,
498
+ maxTimeout: this.config.execution.timeout * 2,
499
+ defaultMemoryLimit: this.config.execution.memory,
500
+ maxMemoryLimit: this.config.execution.memory * 2,
501
+ defaultLLMCallLimit: this.config.execution.llmCalls,
502
+ maxLLMCallLimit: this.config.execution.llmCalls * 2,
503
+ cacheProvider: this.cacheProvider,
504
+ }, this.apiGroups, this.approvalHandler, this.sessionManager);
505
+ }
506
+ for (const group of groups) {
507
+ log.info(` ✅ Dynamically loaded: ${group.name} (${group.functions?.length || 0} functions)`);
508
+ }
509
+ }
510
+ /**
511
+ * Load an OpenAPI spec and add it to the server
512
+ * Works both before and after server starts
513
+ * @param source - URL or file path to OpenAPI spec
514
+ * @param options - OpenAPI loading options
515
+ */
516
+ async loadOpenAPI(source, options = {}) {
517
+ const { loadOpenAPI: loadSpec } = await import('./openapi-loader.js');
518
+ log.info(`📚 Loading OpenAPI spec: ${options.name || 'API'} from ${source}`);
519
+ try {
520
+ const apiGroup = await loadSpec(source, options);
521
+ this.use(apiGroup);
522
+ return this;
523
+ }
524
+ catch (error) {
525
+ log.error(`❌ Failed to load OpenAPI spec: ${error.message}`);
526
+ throw error;
527
+ }
528
+ }
529
+ /**
530
+ * Load a GraphQL spec and add it to the server
531
+ * Works both before and after server starts
532
+ * @param source - URL or file path to GraphQL spec (SDL, introspection JSON, or endpoint URL)
533
+ * @param options - GraphQL loading options
534
+ */
535
+ async loadGraphQL(source, options = {}) {
536
+ try {
537
+ const apiGroup = await loadGraphQL(source, options);
538
+ this.use(apiGroup);
539
+ return this;
540
+ }
541
+ catch (error) {
542
+ log.error(`Failed to load GraphQL spec: ${error.message}`);
543
+ throw error;
544
+ }
545
+ }
384
546
  /**
385
547
  * Get raw Node.js request handler for framework integration
386
548
  * Use this to integrate ATP with Express, Fastify, or any Node.js framework
549
+ * Components will be automatically initialized on first request if not already started.
387
550
  */
388
551
  handler() {
389
- if (!this.executor ||
390
- !this.validator ||
391
- !this.stateManager ||
392
- !this.sessionManager ||
393
- !this.searchEngine ||
394
- !this.explorerService) {
395
- throw new Error('Server not initialized. Call listen() first or initialize components manually.');
396
- }
397
- this.isRunning = true;
398
- return (req, res) => handleHTTPRequest(req, res, {
399
- cacheProvider: this.cacheProvider,
400
- authProvider: this.authProvider,
401
- auditSink: this.auditSink,
402
- customLogger: this.customLogger,
403
- middleware: this.middleware,
404
- routeHandler: (ctx) => handleRoute(ctx, this),
405
- sessionManager: this.sessionManager,
406
- }, this.responseHeaders);
552
+ return async (req, res) => {
553
+ if (!this.isRunning && !this.initPromise) {
554
+ this.initPromise = this.start();
555
+ }
556
+ if (this.initPromise) {
557
+ await this.initPromise;
558
+ this.initPromise = null;
559
+ }
560
+ return handleHTTPRequest(req, res, {
561
+ cacheProvider: this.cacheProvider,
562
+ authProvider: this.authProvider,
563
+ auditSink: this.auditSink,
564
+ customLogger: this.customLogger,
565
+ middleware: this.middleware,
566
+ routeHandler: (ctx) => handleRoute(ctx, this),
567
+ sessionManager: this.sessionManager,
568
+ }, this.responseHeaders);
569
+ };
407
570
  }
408
571
  /**
409
572
  * Get Express middleware
@@ -414,7 +577,10 @@ export class AgentToolProtocolServer {
414
577
  toExpress() {
415
578
  const requestHandler = this.handler();
416
579
  return (req, res, next) => {
417
- requestHandler(req, res).catch(next);
580
+ requestHandler(req, res).catch((error) => {
581
+ log.error('Express handler error:', error);
582
+ next(error);
583
+ });
418
584
  };
419
585
  }
420
586
  /**
@@ -427,6 +593,10 @@ export class AgentToolProtocolServer {
427
593
  return async (request, reply) => {
428
594
  const req = request.raw;
429
595
  const res = reply.raw;
596
+ const fastifyReq = request;
597
+ if (fastifyReq.body !== undefined) {
598
+ req.body = fastifyReq.body;
599
+ }
430
600
  await requestHandler(req, res);
431
601
  };
432
602
  }