@openserv-labs/sdk 2.0.1 → 2.2.0

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/README.md CHANGED
@@ -320,6 +320,7 @@ agent.start()
320
320
  | `PORT` | Server port | No | 7378 |
321
321
  | `OPENSERV_AUTH_TOKEN` | Token for authenticating incoming requests | No | - |
322
322
  | `OPENSERV_PROXY_URL` | Custom proxy URL for tunnel connections | No | `https://agents-proxy.openserv.ai` |
323
+ | `DISABLE_TUNNEL` | Skip tunnel and run HTTP server only | No | - |
323
324
 
324
325
  \*Required if using OpenAI integration features
325
326
 
@@ -794,12 +795,15 @@ The `run()` function automatically:
794
795
 
795
796
  #### Tunnel vs. Deployed Endpoint
796
797
 
797
- | Aspect | Tunnel (Local Development) | Deployed Endpoint (Production) |
798
- | ----------------- | -------------------------- | ------------------------------ |
799
- | Setup | Just run your code | Deploy to cloud/server |
800
- | URL Configuration | Not needed | Set Agent Endpoint in platform |
801
- | Connection | WebSocket via proxy | Direct HTTP |
802
- | Use case | Development & testing | Production |
798
+ | Aspect | Tunnel (Local Development) | Deployed Endpoint (Production) |
799
+ | ----------------- | -------------------------- | ------------------------------------ |
800
+ | Setup | Just run your code | Deploy to cloud/server |
801
+ | URL Configuration | Not needed | Set Agent Endpoint in platform |
802
+ | Connection | WebSocket via proxy | Direct HTTP |
803
+ | Tunnel | Enabled (default) | Disabled (`DISABLE_TUNNEL=true`) |
804
+ | Use case | Development & testing | Production |
805
+
806
+ When deploying to a hosting provider like Cloud Run, set `DISABLE_TUNNEL=true` as an environment variable. This makes `run()` start only the HTTP server without opening a WebSocket tunnel to the proxy — the platform reaches your agent directly at its public URL.
803
807
 
804
808
  #### Configuration Options
805
809
 
package/dist/agent.d.ts CHANGED
@@ -19,6 +19,12 @@ export interface AgentOptions<T extends string> {
19
19
  * Can also be provided via OPENSERV_API_KEY environment variable.
20
20
  */
21
21
  apiKey?: string;
22
+ /**
23
+ * The auth token for securing agent requests.
24
+ * Can also be provided via OPENSERV_AUTH_TOKEN environment variable.
25
+ * Generated by provision() and used to validate incoming requests.
26
+ */
27
+ authToken?: string;
22
28
  /**
23
29
  * The system prompt that defines the agent's behavior and context.
24
30
  * Used as the initial system message in OpenAI chat completions.
@@ -82,25 +88,46 @@ export declare class Agent<M extends string = string> {
82
88
  protected tools: Array<Capability<M, z.ZodTypeAny>>;
83
89
  /**
84
90
  * The OpenServ API key used for authentication.
85
- * Can be provided in options or via OPENSERV_API_KEY environment variable.
86
- * @private
91
+ * Set via setCredentials() or resolved from options/env in start().
87
92
  */
88
- private _apiKey;
93
+ apiKey?: string;
89
94
  /**
90
- * Gets the OpenServ API key for this agent instance.
91
- * Used by run() to pass the correct key to the tunnel.
92
- * @returns The API key for this agent
95
+ * The auth token used to validate incoming requests.
96
+ * Set via setCredentials() or resolved from options/env in start().
97
+ */
98
+ authToken?: string;
99
+ /**
100
+ * Set credentials for this agent instance.
101
+ * This is typically called by provision() to bind the agent to its platform credentials.
102
+ *
103
+ * @param credentials - The credentials to set
104
+ * @param credentials.apiKey - The OpenServ API key for this agent
105
+ * @param credentials.authToken - Optional auth token for securing agent requests
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * // Typically called by provision() automatically:
110
+ * await provision({
111
+ * agent: { instance: myAgent, name: 'my-agent', ... }
112
+ * })
113
+ *
114
+ * // Or manually:
115
+ * agent.setCredentials({ apiKey: 'key', authToken: 'token' })
116
+ * ```
93
117
  */
94
- get apiKey(): string;
118
+ setCredentials(credentials: {
119
+ apiKey: string;
120
+ authToken?: string;
121
+ }): void;
95
122
  /**
96
123
  * Axios instance for making requests to the OpenServ API.
97
- * Pre-configured with base URL and authentication headers.
124
+ * Initialized in start() after credentials are resolved.
98
125
  * @private
99
126
  */
100
127
  private apiClient;
101
128
  /**
102
129
  * Axios instance for making requests to the OpenServ Runtime API.
103
- * Pre-configured with base URL and authentication headers.
130
+ * Initialized in start() after credentials are resolved.
104
131
  * @protected
105
132
  */
106
133
  protected runtimeClient: AxiosInstance;
@@ -132,11 +159,9 @@ export declare class Agent<M extends string = string> {
132
159
  private get openai();
133
160
  /**
134
161
  * Creates a new Agent instance.
135
- * Sets up the Express application, middleware, and routes.
136
- * Initializes API clients with appropriate authentication.
162
+ * The agent is configured but not started until start() is called.
137
163
  *
138
164
  * @param {AgentOptions} options - Configuration options for the agent
139
- * @throws {Error} If OpenServ API key is not provided in options or environment
140
165
  */
141
166
  constructor(options: AgentOptions<M>);
142
167
  private initializeMCPClients;
@@ -404,17 +429,17 @@ export declare class Agent<M extends string = string> {
404
429
  body: unknown;
405
430
  }): Promise<void>;
406
431
  /**
407
- * Sets up the Express routes for the agent's HTTP server.
408
- * Configures health check endpoint and routes for tool execution.
432
+ * Defines routes on the router (called in constructor).
433
+ * Routes are attached to the app in start() after middleware is configured.
409
434
  * @private
410
435
  */
411
- private setupRoutes;
436
+ private defineRoutes;
412
437
  /**
413
438
  * Starts the agent's HTTP server.
414
439
  * If the preferred port is unavailable, it will find an open port.
415
440
  *
416
441
  * @returns {Promise<void>} Resolves when the server has started
417
- * @throws {Error} If server fails to start
442
+ * @throws {Error} If server fails to start or if API key is missing
418
443
  */
419
444
  start(): Promise<void>;
420
445
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA;AAUjD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAEhB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAOlB,YAAY,EACZ,kBAAkB,EAClB,8BAA8B,EAC/B,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EACV,0BAA0B,EAE1B,cAAc,EACf,MAAM,mCAAmC,CAAA;AAI1C,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAGL,KAAK,eAAe,EAEpB,SAAS,EACV,MAAM,OAAO,CAAA;AAOd;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;IAC5C;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAEnE;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;CACxC;AAoBD,qBAAa,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAmI9B,OAAO,CAAC,OAAO;IAlI3B;;;;OAIG;IACH,OAAO,CAAC,GAAG,CAAqB;IAEhC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAA2B;IAEzC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAqB;IAEnC;;;;OAIG;IACI,IAAI,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAE9B;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAK;IAExD;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAAQ;IAEvB;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAe;IAEhC;;;;OAIG;IACH,SAAS,CAAC,aAAa,EAAE,aAAa,CAAA;IAEtC;;;;OAIG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAE1B;;;OAGG;IACI,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAgC;IAE1E;;;;;OAKG;IACH,OAAO,KAAK,WAAW,GAStB;IAED;;;;;;OAMG;IACH,OAAO,KAAK,MAAM,GAWjB;IAED;;;;;;;OAOG;gBACiB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAgD5C,OAAO,CAAC,oBAAoB;IAgB5B;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EACpC,IAAI,EACJ,WAAW,EACX,MAAM,EACN,GAAG,EACJ,EAAE;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,CAAC,CAAA;QACT,GAAG,CACD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,MAAM,EAAE;YAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,YAAY,CAAA;SAAE,EACnD,QAAQ,EAAE,0BAA0B,EAAE,GACrC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;KAC5B,GAAG,IAAI;IAYR;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE;SACjF,CAAC,IAAI,MAAM,CAAC,GAAG;YACd,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,EAAE,MAAM,CAAA;YACnB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACZ,GAAG,CACD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,MAAM,EAAE;gBAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,CAAC,EAAE,YAAY,CAAA;aAAE,EACtD,QAAQ,EAAE,0BAA0B,EAAE,GACrC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;SAC5B;KACF,GAAG,IAAI;IAOR;;;;;;OAMG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc;IAOrC;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAOzC;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,oBAAoB;IAOjD;;;;;;;;;;OAUG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB;IA6BzC;;;;;;;OAOG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAOzC;;;;;;;;OAQG;IACG,iBAAiB,CAAC,MAAM,EAAE,uBAAuB;IAUvD;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,kBAAkB;IAU7C;;;;;;;;OAQG;IACG,eAAe,CAAC,MAAM,EAAE,qBAAqB;IAUnD;;;;;;;OAOG;IACG,aAAa,CAAC,MAAM,EAAE,mBAAmB;IAO/C;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,eAAe;IAOvC;;;;;;OAMG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc;IAOrC;;;;;;;OAOG;IACG,eAAe,CAAC,MAAM,EAAE,qBAAqB;IAOnD;;;;;;;;;;;;OAYG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAezC;;;;;;;;;;OAUG;IACG,YAAY,CAAC,MAAM,EAAE,kBAAkB;IAY7C;;;;;;;;;;OAUG;IACG,sBAAsB,CAAC,MAAM,EAAE,4BAA4B;IA0BjE;;;;;;;;OAQG;IACG,gBAAgB,CAAC,MAAM,EAAE,sBAAsB;IAUrD;;;;;;;OAOG;IACG,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA4FnE;;;;OAIG;cACa,MAAM,CAAC,MAAM,EAAE,kBAAkB;IA6BjD;;;;OAIG;cACa,aAAa,CAAC,MAAM,EAAE,8BAA8B;IA+BpE;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,GAAG,EAAE;QACzB,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;QAC5B,IAAI,EAAE;YACJ,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;YAC5B,MAAM,CAAC,EAAE,YAAY,CAAA;YACrB,QAAQ,CAAC,EAAE,0BAA0B,EAAE,CAAA;SACxC,CAAA;KACF;;;IAyBD;;;;;;;OAOG;IACG,eAAe,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE;IAgB5C;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAuBnB;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqF5B;;;;OAIG;IACG,IAAI;IAQV;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,WAAW,EAAE,sBAAsB;IASzD;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;CAsClC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -21,20 +21,6 @@ const mcp_1 = require("./mcp");
21
21
  const PLATFORM_URL = process.env.OPENSERV_API_URL || 'https://api.openserv.ai';
22
22
  const RUNTIME_URL = process.env.OPENSERV_RUNTIME_URL || 'https://agents.openserv.ai';
23
23
  const DEFAULT_PORT = Number.parseInt(process.env.PORT || '') || 7378;
24
- const AUTH_TOKEN = process.env.OPENSERV_AUTH_TOKEN;
25
- const authTokenMiddleware = async (req, res, next) => {
26
- const tokenHash = req.headers['x-openserv-auth-token'];
27
- if (!tokenHash || typeof tokenHash !== 'string') {
28
- res.status(401).json({ error: 'Unauthorized' });
29
- return;
30
- }
31
- const isTokenValid = await bcryptjs_1.default.compare(AUTH_TOKEN, tokenHash);
32
- if (!isTokenValid) {
33
- res.status(401).json({ error: 'Unauthorized' });
34
- return;
35
- }
36
- next();
37
- };
38
24
  class Agent {
39
25
  options;
40
26
  /**
@@ -75,27 +61,46 @@ class Agent {
75
61
  tools = [];
76
62
  /**
77
63
  * The OpenServ API key used for authentication.
78
- * Can be provided in options or via OPENSERV_API_KEY environment variable.
79
- * @private
64
+ * Set via setCredentials() or resolved from options/env in start().
65
+ */
66
+ apiKey;
67
+ /**
68
+ * The auth token used to validate incoming requests.
69
+ * Set via setCredentials() or resolved from options/env in start().
80
70
  */
81
- _apiKey;
71
+ authToken;
82
72
  /**
83
- * Gets the OpenServ API key for this agent instance.
84
- * Used by run() to pass the correct key to the tunnel.
85
- * @returns The API key for this agent
73
+ * Set credentials for this agent instance.
74
+ * This is typically called by provision() to bind the agent to its platform credentials.
75
+ *
76
+ * @param credentials - The credentials to set
77
+ * @param credentials.apiKey - The OpenServ API key for this agent
78
+ * @param credentials.authToken - Optional auth token for securing agent requests
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * // Typically called by provision() automatically:
83
+ * await provision({
84
+ * agent: { instance: myAgent, name: 'my-agent', ... }
85
+ * })
86
+ *
87
+ * // Or manually:
88
+ * agent.setCredentials({ apiKey: 'key', authToken: 'token' })
89
+ * ```
86
90
  */
87
- get apiKey() {
88
- return this._apiKey;
91
+ setCredentials(credentials) {
92
+ this.apiKey = credentials.apiKey;
93
+ this.authToken = credentials.authToken;
89
94
  }
90
95
  /**
91
96
  * Axios instance for making requests to the OpenServ API.
92
- * Pre-configured with base URL and authentication headers.
97
+ * Initialized in start() after credentials are resolved.
93
98
  * @private
94
99
  */
95
100
  apiClient;
96
101
  /**
97
102
  * Axios instance for making requests to the OpenServ Runtime API.
98
- * Pre-configured with base URL and authentication headers.
103
+ * Initialized in start() after credentials are resolved.
99
104
  * @protected
100
105
  */
101
106
  runtimeClient;
@@ -145,11 +150,9 @@ class Agent {
145
150
  }
146
151
  /**
147
152
  * Creates a new Agent instance.
148
- * Sets up the Express application, middleware, and routes.
149
- * Initializes API clients with appropriate authentication.
153
+ * The agent is configured but not started until start() is called.
150
154
  *
151
155
  * @param {AgentOptions} options - Configuration options for the agent
152
- * @throws {Error} If OpenServ API key is not provided in options or environment
153
156
  */
154
157
  constructor(options) {
155
158
  this.options = options;
@@ -157,39 +160,10 @@ class Agent {
157
160
  this.router = (0, express_async_router_1.AsyncRouter)();
158
161
  this.port = this.options.port || DEFAULT_PORT;
159
162
  this.systemPrompt = this.options.systemPrompt;
160
- this._apiKey = this.options.apiKey || process.env.OPENSERV_API_KEY || '';
161
- if (!this._apiKey) {
162
- throw new Error('OpenServ API key is required. Please provide it in options or set OPENSERV_API_KEY environment variable.');
163
- }
164
- // Initialize API client
165
- this.apiClient = axios_1.default.create({
166
- baseURL: PLATFORM_URL,
167
- headers: {
168
- 'Content-Type': 'application/json',
169
- 'x-openserv-key': this.apiKey
170
- }
171
- });
172
- // Initialize runtime client
173
- this.runtimeClient = axios_1.default.create({
174
- baseURL: `${RUNTIME_URL}/runtime`,
175
- headers: {
176
- 'Content-Type': 'application/json',
177
- 'x-openserv-key': this.apiKey
178
- }
179
- });
180
- this.app.use(express_1.default.json({ limit: '10mb' }));
181
- this.app.use(express_1.default.urlencoded({ extended: false }));
182
- this.app.use((0, hpp_1.default)());
183
- this.app.use((0, helmet_1.default)());
184
- this.app.use((0, compression_1.default)());
185
- if (AUTH_TOKEN) {
186
- this.app.use(authTokenMiddleware);
187
- }
188
- else {
189
- logger_1.logger.warn('OPENSERV_AUTH_TOKEN is not set. All requests will be allowed.');
190
- }
191
- this.setupRoutes();
163
+ // Initialize MCP clients (no credentials needed)
192
164
  this.initializeMCPClients();
165
+ // Define routes (they'll be attached to app in start())
166
+ this.defineRoutes();
193
167
  }
194
168
  initializeMCPClients() {
195
169
  if (this.options.mcpServers) {
@@ -720,11 +694,11 @@ class Agent {
720
694
  }
721
695
  }
722
696
  /**
723
- * Sets up the Express routes for the agent's HTTP server.
724
- * Configures health check endpoint and routes for tool execution.
697
+ * Defines routes on the router (called in constructor).
698
+ * Routes are attached to the app in start() after middleware is configured.
725
699
  * @private
726
700
  */
727
- setupRoutes() {
701
+ defineRoutes() {
728
702
  this.router.get('/health', async (_req, res) => {
729
703
  res.status(200).json({ status: 'ok', uptime: process.uptime() });
730
704
  });
@@ -741,16 +715,68 @@ class Agent {
741
715
  body: req.body
742
716
  });
743
717
  });
744
- this.app.use('/', this.router);
745
718
  }
746
719
  /**
747
720
  * Starts the agent's HTTP server.
748
721
  * If the preferred port is unavailable, it will find an open port.
749
722
  *
750
723
  * @returns {Promise<void>} Resolves when the server has started
751
- * @throws {Error} If server fails to start
724
+ * @throws {Error} If server fails to start or if API key is missing
752
725
  */
753
726
  async start() {
727
+ // Resolve credentials from options or environment if not already set via setCredentials()
728
+ if (!this.apiKey) {
729
+ this.apiKey = this.options.apiKey || process.env.OPENSERV_API_KEY;
730
+ }
731
+ if (!this.authToken) {
732
+ this.authToken = this.options.authToken || process.env.OPENSERV_AUTH_TOKEN;
733
+ }
734
+ // Validate API key
735
+ if (!this.apiKey) {
736
+ throw new Error('OpenServ API key is required. Please provide it in options, set OPENSERV_API_KEY environment variable, or call provision() first.');
737
+ }
738
+ // Initialize API clients
739
+ this.apiClient = axios_1.default.create({
740
+ baseURL: PLATFORM_URL,
741
+ headers: {
742
+ 'Content-Type': 'application/json',
743
+ 'x-openserv-key': this.apiKey
744
+ }
745
+ });
746
+ this.runtimeClient = axios_1.default.create({
747
+ baseURL: `${RUNTIME_URL}/runtime`,
748
+ headers: {
749
+ 'Content-Type': 'application/json',
750
+ 'x-openserv-key': this.apiKey
751
+ }
752
+ });
753
+ // Set up middleware
754
+ this.app.use(express_1.default.json({ limit: '10mb' }));
755
+ this.app.use(express_1.default.urlencoded({ extended: false }));
756
+ this.app.use((0, hpp_1.default)());
757
+ this.app.use((0, helmet_1.default)());
758
+ this.app.use((0, compression_1.default)());
759
+ // Auth middleware
760
+ if (this.authToken) {
761
+ this.app.use(async (req, res, next) => {
762
+ const tokenHash = req.headers['x-openserv-auth-token'];
763
+ if (!tokenHash || typeof tokenHash !== 'string') {
764
+ res.status(401).json({ error: 'Unauthorized' });
765
+ return;
766
+ }
767
+ const isTokenValid = await bcryptjs_1.default.compare(this.authToken, tokenHash);
768
+ if (!isTokenValid) {
769
+ res.status(401).json({ error: 'Unauthorized' });
770
+ return;
771
+ }
772
+ next();
773
+ });
774
+ }
775
+ else {
776
+ logger_1.logger.warn('OPENSERV_AUTH_TOKEN is not set. All requests will be allowed.');
777
+ }
778
+ // Attach routes to app (routes are defined in constructor)
779
+ this.app.use('/', this.router);
754
780
  const preferredPort = this.port;
755
781
  // Try the preferred port first, fallback to an available port if it fails
756
782
  await new Promise((resolve, reject) => {
package/dist/run.d.ts CHANGED
@@ -15,8 +15,9 @@ export interface RunOptions {
15
15
  export interface RunResult {
16
16
  /**
17
17
  * The tunnel instance for advanced control.
18
+ * Null when the tunnel is disabled (DISABLE_TUNNEL=true).
18
19
  */
19
- tunnel: OpenServTunnel;
20
+ tunnel: OpenServTunnel | null;
20
21
  /**
21
22
  * Stop the agent and tunnel.
22
23
  */
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAMrE,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC,CAAA;IAE7E;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,MAAM,EAAE,cAAc,CAAA;IAEtB;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CA8EhF"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAMrE,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC,CAAA;IAE7E;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IAE7B;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAsFhF"}
package/dist/run.js CHANGED
@@ -40,27 +40,34 @@ const tunnel_1 = require("./tunnel");
40
40
  */
41
41
  async function run(agent, options) {
42
42
  await agent.start();
43
- const tunnel = new tunnel_1.OpenServTunnel({
44
- ...options?.tunnel,
45
- // Always use the agent's API key to ensure tunnel authenticates as the correct agent
46
- // This prevents issues when running multiple agents with different API keys
47
- apiKey: agent.apiKey,
48
- onConnected: isReconnect => {
49
- if (!isReconnect) {
50
- logger_1.logger.info('Agent connected to OpenServ proxy');
43
+ const tunnelDisabled = process.env.DISABLE_TUNNEL === 'true';
44
+ let tunnel = null;
45
+ if (!tunnelDisabled) {
46
+ tunnel = new tunnel_1.OpenServTunnel({
47
+ ...options?.tunnel,
48
+ // Always use the agent's API key to ensure tunnel authenticates as the correct agent
49
+ // This prevents issues when running multiple agents with different API keys
50
+ apiKey: agent.apiKey,
51
+ onConnected: isReconnect => {
52
+ if (!isReconnect) {
53
+ logger_1.logger.info('Agent connected to OpenServ proxy');
54
+ }
55
+ },
56
+ onError: error => {
57
+ logger_1.logger.error(`Tunnel error: ${error.message}`);
51
58
  }
52
- },
53
- onError: error => {
54
- logger_1.logger.error(`Tunnel error: ${error.message}`);
59
+ });
60
+ try {
61
+ await tunnel.start(agent.port);
62
+ }
63
+ catch (error) {
64
+ // Clean up the agent if tunnel fails to connect
65
+ await agent.stop();
66
+ throw error;
55
67
  }
56
- });
57
- try {
58
- await tunnel.start(agent.port);
59
68
  }
60
- catch (error) {
61
- // Clean up the agent if tunnel fails to connect
62
- await agent.stop();
63
- throw error;
69
+ else {
70
+ logger_1.logger.info(`Agent running on port ${agent.port} (tunnel disabled)`);
64
71
  }
65
72
  let shutdownPromise = null;
66
73
  let sigtermHandler = null;
@@ -80,7 +87,8 @@ async function run(agent, options) {
80
87
  process.removeListener('SIGINT', sigintHandler);
81
88
  sigintHandler = null;
82
89
  }
83
- await tunnel.stop();
90
+ if (tunnel)
91
+ await tunnel.stop();
84
92
  await agent.stop();
85
93
  })();
86
94
  return shutdownPromise;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openserv-labs/sdk",
3
- "version": "2.0.1",
3
+ "version": "2.2.0",
4
4
  "description": "OpenServ Agent SDK - Create AI agents easily",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",