@happyvertical/smrt-core 0.36.7 → 0.36.8

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "timestamp": 1782507312564,
3
+ "timestamp": 1782522843119,
4
4
  "packageName": "@happyvertical/smrt-core",
5
- "packageVersion": "0.36.7",
5
+ "packageVersion": "0.36.8",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-core:SmrtClass": {
8
8
  "name": "smrtclass",
@@ -5,27 +5,27 @@ export declare class SmrtClient {
5
5
  /**
6
6
  * Make an authenticated request
7
7
  */
8
- request(method: string, path: string, data?: any): Promise<any>;
8
+ request(method: string, path: string, data?: unknown): Promise<unknown>;
9
9
  /**
10
10
  * GET request
11
11
  */
12
- get(path: string, params?: Record<string, any>): Promise<any>;
12
+ get(path: string, params?: Record<string, unknown>): Promise<unknown>;
13
13
  /**
14
14
  * POST request
15
15
  */
16
- post(path: string, data?: any): Promise<any>;
16
+ post(path: string, data?: unknown): Promise<unknown>;
17
17
  /**
18
18
  * PUT request
19
19
  */
20
- put(path: string, data?: any): Promise<any>;
20
+ put(path: string, data?: unknown): Promise<unknown>;
21
21
  /**
22
22
  * PATCH request
23
23
  */
24
- patch(path: string, data?: any): Promise<any>;
24
+ patch(path: string, data?: unknown): Promise<unknown>;
25
25
  /**
26
26
  * DELETE request
27
27
  */
28
- delete(path: string): Promise<any>;
28
+ delete(path: string): Promise<unknown>;
29
29
  }
30
30
  /**
31
31
  * Create a new SMRT client instance
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/runtime/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,OAAO,GAAE,iBAAsB;IAS3C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAyDrE;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAenE;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAIlD;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAIjD;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAInD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAGzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/runtime/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,OAAO,GAAE,iBAAsB;IAS3C;;OAEG;IACG,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC;IAyDnB;;OAEG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC;IAenB;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1D;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3D;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../src/runtime/client.ts"],"sourcesContent":["/**\n * Runtime client implementation for SMRT auto-generated services\n */\n\nimport type { SmrtClientOptions } from './types';\n\nexport class SmrtClient {\n private options: Required<SmrtClientOptions>;\n\n constructor(options: SmrtClientOptions = {}) {\n this.options = {\n baseUrl: 'http://localhost:3000',\n basePath: '/api/v1',\n fetch: globalThis.fetch,\n ...options,\n } as Required<SmrtClientOptions>;\n }\n\n /**\n * Make an authenticated request\n */\n async request(method: string, path: string, data?: any): Promise<any> {\n const url = `${this.options.baseUrl}${this.options.basePath}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add authentication headers\n if (this.options.auth) {\n switch (this.options.auth.type) {\n case 'bearer':\n if (this.options.auth.token) {\n headers.Authorization = `Bearer ${this.options.auth.token}`;\n }\n break;\n case 'basic':\n if (this.options.auth.username && this.options.auth.password) {\n const credentials = btoa(\n `${this.options.auth.username}:${this.options.auth.password}`,\n );\n headers.Authorization = `Basic ${credentials}`;\n }\n break;\n }\n }\n\n const requestOptions: RequestInit = {\n method,\n headers,\n };\n\n if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n requestOptions.body = JSON.stringify(data);\n }\n\n const response = await this.options.fetch(url, requestOptions);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Handle empty responses\n if (\n response.status === 204 ||\n response.headers.get('content-length') === '0'\n ) {\n return null;\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n\n return response.text();\n }\n\n /**\n * GET request\n */\n async get(path: string, params?: Record<string, any>): Promise<any> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n url += `?${searchParams.toString()}`;\n }\n\n return this.request('GET', url);\n }\n\n /**\n * POST request\n */\n async post(path: string, data?: any): Promise<any> {\n return this.request('POST', path, data);\n }\n\n /**\n * PUT request\n */\n async put(path: string, data?: any): Promise<any> {\n return this.request('PUT', path, data);\n }\n\n /**\n * PATCH request\n */\n async patch(path: string, data?: any): Promise<any> {\n return this.request('PATCH', path, data);\n }\n\n /**\n * DELETE request\n */\n async delete(path: string): Promise<any> {\n return this.request('DELETE', path);\n }\n}\n\n/**\n * Create a new SMRT client instance\n */\nexport function createSmrtClient(options?: SmrtClientOptions): SmrtClient {\n return new SmrtClient(options);\n}\n"],"names":[],"mappings":"AAMO,MAAM,WAAW;AAAA,EACd;AAAA,EAER,YAAY,UAA6B,IAAI;AAC3C,SAAK,UAAU;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO,WAAW;AAAA,MAClB,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAgB,MAAc,MAA0B;AACpE,UAAM,MAAM,GAAG,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,QAAQ,GAAG,IAAI;AAElE,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAAA;AAIlB,QAAI,KAAK,QAAQ,MAAM;AACrB,cAAQ,KAAK,QAAQ,KAAK,MAAA;AAAA,QACxB,KAAK;AACH,cAAI,KAAK,QAAQ,KAAK,OAAO;AAC3B,oBAAQ,gBAAgB,UAAU,KAAK,QAAQ,KAAK,KAAK;AAAA,UAC3D;AACA;AAAA,QACF,KAAK;AACH,cAAI,KAAK,QAAQ,KAAK,YAAY,KAAK,QAAQ,KAAK,UAAU;AAC5D,kBAAM,cAAc;AAAA,cAClB,GAAG,KAAK,QAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ,KAAK,QAAQ;AAAA,YAAA;AAE7D,oBAAQ,gBAAgB,SAAS,WAAW;AAAA,UAC9C;AACA;AAAA,MAAA;AAAA,IAEN;AAEA,UAAM,iBAA8B;AAAA,MAClC;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,SAAS,WAAW,UAAU,WAAW,SAAS,WAAW,UAAU;AACzE,qBAAe,OAAO,KAAK,UAAU,IAAI;AAAA,IAC3C;AAEA,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,KAAK,cAAc;AAE7D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,IACnE;AAGA,QACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAC3C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,aAAO,SAAS,KAAA;AAAA,IAClB;AAEA,WAAO,SAAS,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAc,QAA4C;AAClE,QAAI,MAAM;AACV,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,YAAM,eAAe,IAAI,gBAAA;AACzB,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,uBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AACD,aAAO,IAAI,aAAa,SAAA,CAAU;AAAA,IACpC;AAEA,WAAO,KAAK,QAAQ,OAAO,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,MAAc,MAA0B;AACjD,WAAO,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAc,MAA0B;AAChD,WAAO,KAAK,QAAQ,OAAO,MAAM,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAc,MAA0B;AAClD,WAAO,KAAK,QAAQ,SAAS,MAAM,IAAI;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,MAA4B;AACvC,WAAO,KAAK,QAAQ,UAAU,IAAI;AAAA,EACpC;AACF;AAKO,SAAS,iBAAiB,SAAyC;AACxE,SAAO,IAAI,WAAW,OAAO;AAC/B;"}
1
+ {"version":3,"file":"client.js","sources":["../../src/runtime/client.ts"],"sourcesContent":["/**\n * Runtime client implementation for SMRT auto-generated services\n */\n\nimport type { SmrtClientOptions } from './types';\n\nexport class SmrtClient {\n private options: Required<SmrtClientOptions>;\n\n constructor(options: SmrtClientOptions = {}) {\n this.options = {\n baseUrl: 'http://localhost:3000',\n basePath: '/api/v1',\n fetch: globalThis.fetch,\n ...options,\n } as Required<SmrtClientOptions>;\n }\n\n /**\n * Make an authenticated request\n */\n async request(\n method: string,\n path: string,\n data?: unknown,\n ): Promise<unknown> {\n const url = `${this.options.baseUrl}${this.options.basePath}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add authentication headers\n if (this.options.auth) {\n switch (this.options.auth.type) {\n case 'bearer':\n if (this.options.auth.token) {\n headers.Authorization = `Bearer ${this.options.auth.token}`;\n }\n break;\n case 'basic':\n if (this.options.auth.username && this.options.auth.password) {\n const credentials = btoa(\n `${this.options.auth.username}:${this.options.auth.password}`,\n );\n headers.Authorization = `Basic ${credentials}`;\n }\n break;\n }\n }\n\n const requestOptions: RequestInit = {\n method,\n headers,\n };\n\n if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n requestOptions.body = JSON.stringify(data);\n }\n\n const response = await this.options.fetch(url, requestOptions);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Handle empty responses\n if (\n response.status === 204 ||\n response.headers.get('content-length') === '0'\n ) {\n return null;\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n\n return response.text();\n }\n\n /**\n * GET request\n */\n async get(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<unknown> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n url += `?${searchParams.toString()}`;\n }\n\n return this.request('GET', url);\n }\n\n /**\n * POST request\n */\n async post(path: string, data?: unknown): Promise<unknown> {\n return this.request('POST', path, data);\n }\n\n /**\n * PUT request\n */\n async put(path: string, data?: unknown): Promise<unknown> {\n return this.request('PUT', path, data);\n }\n\n /**\n * PATCH request\n */\n async patch(path: string, data?: unknown): Promise<unknown> {\n return this.request('PATCH', path, data);\n }\n\n /**\n * DELETE request\n */\n async delete(path: string): Promise<unknown> {\n return this.request('DELETE', path);\n }\n}\n\n/**\n * Create a new SMRT client instance\n */\nexport function createSmrtClient(options?: SmrtClientOptions): SmrtClient {\n return new SmrtClient(options);\n}\n"],"names":[],"mappings":"AAMO,MAAM,WAAW;AAAA,EACd;AAAA,EAER,YAAY,UAA6B,IAAI;AAC3C,SAAK,UAAU;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO,WAAW;AAAA,MAClB,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,QACA,MACA,MACkB;AAClB,UAAM,MAAM,GAAG,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,QAAQ,GAAG,IAAI;AAElE,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAAA;AAIlB,QAAI,KAAK,QAAQ,MAAM;AACrB,cAAQ,KAAK,QAAQ,KAAK,MAAA;AAAA,QACxB,KAAK;AACH,cAAI,KAAK,QAAQ,KAAK,OAAO;AAC3B,oBAAQ,gBAAgB,UAAU,KAAK,QAAQ,KAAK,KAAK;AAAA,UAC3D;AACA;AAAA,QACF,KAAK;AACH,cAAI,KAAK,QAAQ,KAAK,YAAY,KAAK,QAAQ,KAAK,UAAU;AAC5D,kBAAM,cAAc;AAAA,cAClB,GAAG,KAAK,QAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ,KAAK,QAAQ;AAAA,YAAA;AAE7D,oBAAQ,gBAAgB,SAAS,WAAW;AAAA,UAC9C;AACA;AAAA,MAAA;AAAA,IAEN;AAEA,UAAM,iBAA8B;AAAA,MAClC;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,SAAS,WAAW,UAAU,WAAW,SAAS,WAAW,UAAU;AACzE,qBAAe,OAAO,KAAK,UAAU,IAAI;AAAA,IAC3C;AAEA,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,KAAK,cAAc;AAE7D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,IACnE;AAGA,QACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAC3C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,aAAO,SAAS,KAAA;AAAA,IAClB;AAEA,WAAO,SAAS,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IACJ,MACA,QACkB;AAClB,QAAI,MAAM;AACV,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,YAAM,eAAe,IAAI,gBAAA;AACzB,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,uBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AACD,aAAO,IAAI,aAAa,SAAA,CAAU;AAAA,IACpC;AAEA,WAAO,KAAK,QAAQ,OAAO,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,MAAc,MAAkC;AACzD,WAAO,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAc,MAAkC;AACxD,WAAO,KAAK,QAAQ,OAAO,MAAM,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAc,MAAkC;AAC1D,WAAO,KAAK,QAAQ,SAAS,MAAM,IAAI;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,MAAgC;AAC3C,WAAO,KAAK,QAAQ,UAAU,IAAI;AAAA,EACpC;AACF;AAKO,SAAS,iBAAiB,SAAyC;AACxE,SAAO,IAAI,WAAW,OAAO;AAC/B;"}
@@ -1,16 +1,23 @@
1
1
  /**
2
2
  * Runtime MCP server implementation for SMRT auto-generated services
3
3
  */
4
+ /**
5
+ * Handler invoked when an MCP tool is executed. `params` arrives from the MCP
6
+ * protocol as untyped JSON; each handler narrows the shape it expects. The
7
+ * resolved value is serialized back to the MCP client as the tool result.
8
+ */
9
+ export type MCPToolHandler = (params: Record<string, unknown>) => Promise<unknown>;
4
10
  export interface MCPTool {
5
11
  name: string;
6
12
  description: string;
7
- inputSchema: any;
13
+ /** JSON Schema describing the tool's accepted parameters. */
14
+ inputSchema: Record<string, unknown>;
8
15
  }
9
16
  export interface MCPServerOptions {
10
17
  name?: string;
11
18
  version?: string;
12
19
  tools?: MCPTool[];
13
- handlers?: Record<string, (params: any) => Promise<any>>;
20
+ handlers?: Record<string, MCPToolHandler>;
14
21
  }
15
22
  export declare class SmrtMCPServer {
16
23
  private options;
@@ -18,7 +25,7 @@ export declare class SmrtMCPServer {
18
25
  /**
19
26
  * Add a tool to the server
20
27
  */
21
- addTool(tool: MCPTool, handler: (params: any) => Promise<any>): void;
28
+ addTool(tool: MCPTool, handler: MCPToolHandler): void;
22
29
  /**
23
30
  * Get all available tools
24
31
  */
@@ -26,7 +33,7 @@ export declare class SmrtMCPServer {
26
33
  /**
27
34
  * Execute a tool
28
35
  */
29
- executeTool(name: string, params: any): Promise<any>;
36
+ executeTool(name: string, params: Record<string, unknown>): Promise<unknown>;
30
37
  /**
31
38
  * Get server info
32
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/runtime/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1D;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,GAAE,gBAAqB;IAU1C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI;IAKpE;;OAEG;IACH,QAAQ,IAAI,OAAO,EAAE;IAIrB;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAe1D;;OAEG;IACH,aAAa;;;;;IAQb;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAEzE"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/runtime/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC3C;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,GAAE,gBAAqB;IAU1C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAKrD;;OAEG;IACH,QAAQ,IAAI,OAAO,EAAE;IAIrB;;OAEG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAenB;;OAEG;IACH,aAAa;;;;;IAQb;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAEzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sources":["../../src/runtime/mcp.ts"],"sourcesContent":["/**\n * Runtime MCP server implementation for SMRT auto-generated services\n */\n\nimport { createLogger } from '@happyvertical/logger';\n\nconst logger = createLogger({ level: 'info' });\n\nexport interface MCPTool {\n name: string;\n description: string;\n inputSchema: any;\n}\n\nexport interface MCPServerOptions {\n name?: string;\n version?: string;\n tools?: MCPTool[];\n handlers?: Record<string, (params: any) => Promise<any>>;\n}\n\nexport class SmrtMCPServer {\n private options: Required<MCPServerOptions>;\n\n constructor(options: MCPServerOptions = {}) {\n this.options = {\n name: 'smrt-auto-generated',\n version: '1.0.0',\n tools: [],\n handlers: {},\n ...options,\n };\n }\n\n /**\n * Add a tool to the server\n */\n addTool(tool: MCPTool, handler: (params: any) => Promise<any>): void {\n this.options.tools.push(tool);\n this.options.handlers[tool.name] = handler;\n }\n\n /**\n * Get all available tools\n */\n getTools(): MCPTool[] {\n return this.options.tools;\n }\n\n /**\n * Execute a tool\n */\n async executeTool(name: string, params: any): Promise<any> {\n const handler = this.options.handlers[name];\n if (!handler) {\n throw new Error(`Tool '${name}' not found`);\n }\n\n try {\n return await handler(params);\n } catch (error) {\n throw new Error(\n `Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n\n /**\n * Get server info\n */\n getServerInfo() {\n return {\n name: this.options.name,\n version: this.options.version,\n toolCount: this.options.tools.length,\n };\n }\n\n /**\n * Start the MCP server (basic implementation)\n */\n async start(): Promise<void> {\n logger.info(\n `[smrt-mcp] Server '${this.options.name}' started with ${this.options.tools.length} tools`,\n );\n logger.debug(\n `[smrt-mcp] Available tools: ${this.options.tools.map((t) => t.name).join(', ')}`,\n );\n }\n}\n\n/**\n * Create a new SMRT MCP server instance\n */\nexport function createMCPServer(options?: MCPServerOptions): SmrtMCPServer {\n return new SmrtMCPServer(options);\n}\n"],"names":[],"mappings":";AAMA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAetC,MAAM,cAAc;AAAA,EACjB;AAAA,EAER,YAAY,UAA4B,IAAI;AAC1C,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO,CAAA;AAAA,MACP,UAAU,CAAA;AAAA,MACV,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAe,SAA8C;AACnE,SAAK,QAAQ,MAAM,KAAK,IAAI;AAC5B,SAAK,QAAQ,SAAS,KAAK,IAAI,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAsB;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAc,QAA2B;AACzD,UAAM,UAAU,KAAK,QAAQ,SAAS,IAAI;AAC1C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,SAAS,IAAI,aAAa;AAAA,IAC5C;AAEA,QAAI;AACF,aAAO,MAAM,QAAQ,MAAM;AAAA,IAC7B,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAAA;AAAA,IAEtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,QAAQ;AAAA,MACtB,WAAW,KAAK,QAAQ,MAAM;AAAA,IAAA;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,WAAO;AAAA,MACL,sBAAsB,KAAK,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,MAAM,MAAM;AAAA,IAAA;AAEpF,WAAO;AAAA,MACL,+BAA+B,KAAK,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAAA;AAAA,EAEnF;AACF;AAKO,SAAS,gBAAgB,SAA2C;AACzE,SAAO,IAAI,cAAc,OAAO;AAClC;"}
1
+ {"version":3,"file":"mcp.js","sources":["../../src/runtime/mcp.ts"],"sourcesContent":["/**\n * Runtime MCP server implementation for SMRT auto-generated services\n */\n\nimport { createLogger } from '@happyvertical/logger';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Handler invoked when an MCP tool is executed. `params` arrives from the MCP\n * protocol as untyped JSON; each handler narrows the shape it expects. The\n * resolved value is serialized back to the MCP client as the tool result.\n */\nexport type MCPToolHandler = (\n params: Record<string, unknown>,\n) => Promise<unknown>;\n\nexport interface MCPTool {\n name: string;\n description: string;\n /** JSON Schema describing the tool's accepted parameters. */\n inputSchema: Record<string, unknown>;\n}\n\nexport interface MCPServerOptions {\n name?: string;\n version?: string;\n tools?: MCPTool[];\n handlers?: Record<string, MCPToolHandler>;\n}\n\nexport class SmrtMCPServer {\n private options: Required<MCPServerOptions>;\n\n constructor(options: MCPServerOptions = {}) {\n this.options = {\n name: 'smrt-auto-generated',\n version: '1.0.0',\n tools: [],\n handlers: {},\n ...options,\n };\n }\n\n /**\n * Add a tool to the server\n */\n addTool(tool: MCPTool, handler: MCPToolHandler): void {\n this.options.tools.push(tool);\n this.options.handlers[tool.name] = handler;\n }\n\n /**\n * Get all available tools\n */\n getTools(): MCPTool[] {\n return this.options.tools;\n }\n\n /**\n * Execute a tool\n */\n async executeTool(\n name: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const handler = this.options.handlers[name];\n if (!handler) {\n throw new Error(`Tool '${name}' not found`);\n }\n\n try {\n return await handler(params);\n } catch (error) {\n throw new Error(\n `Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n\n /**\n * Get server info\n */\n getServerInfo() {\n return {\n name: this.options.name,\n version: this.options.version,\n toolCount: this.options.tools.length,\n };\n }\n\n /**\n * Start the MCP server (basic implementation)\n */\n async start(): Promise<void> {\n logger.info(\n `[smrt-mcp] Server '${this.options.name}' started with ${this.options.tools.length} tools`,\n );\n logger.debug(\n `[smrt-mcp] Available tools: ${this.options.tools.map((t) => t.name).join(', ')}`,\n );\n }\n}\n\n/**\n * Create a new SMRT MCP server instance\n */\nexport function createMCPServer(options?: MCPServerOptions): SmrtMCPServer {\n return new SmrtMCPServer(options);\n}\n"],"names":[],"mappings":";AAMA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAyBtC,MAAM,cAAc;AAAA,EACjB;AAAA,EAER,YAAY,UAA4B,IAAI;AAC1C,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO,CAAA;AAAA,MACP,UAAU,CAAA;AAAA,MACV,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAe,SAA+B;AACpD,SAAK,QAAQ,MAAM,KAAK,IAAI;AAC5B,SAAK,QAAQ,SAAS,KAAK,IAAI,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAsB;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,MACA,QACkB;AAClB,UAAM,UAAU,KAAK,QAAQ,SAAS,IAAI;AAC1C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,SAAS,IAAI,aAAa;AAAA,IAC5C;AAEA,QAAI;AACF,aAAO,MAAM,QAAQ,MAAM;AAAA,IAC7B,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAAA;AAAA,IAEtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,QAAQ;AAAA,MACtB,WAAW,KAAK,QAAQ,MAAM;AAAA,IAAA;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,WAAO;AAAA,MACL,sBAAsB,KAAK,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,MAAM,MAAM;AAAA,IAAA;AAEpF,WAAO;AAAA,MACL,+BAA+B,KAAK,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAAA;AAAA,EAEnF;AACF;AAKO,SAAS,gBAAgB,SAA2C;AACzE,SAAO,IAAI,cAAc,OAAO;AAClC;"}
@@ -1,4 +1,27 @@
1
+ import { default as http } from 'node:http';
1
2
  import { SmrtRequest, SmrtServerOptions } from './types';
3
+ /**
4
+ * Express-style response object handed to RouteApp-compatibility handlers
5
+ * (registered via {@link SmrtServer.get}/`post`/`put`/`delete`). It mirrors the
6
+ * subset of the Express `res` API that {@link SmrtServer.addExpressStyleRoute}
7
+ * constructs; each terminal method (`json`/`send`/`end`) resolves the wrapped
8
+ * SMRT handler with a Web {@link Response}.
9
+ */
10
+ interface ExpressStyleResponse {
11
+ status(code: number): ExpressStyleResponse;
12
+ json(data: unknown): void;
13
+ send(data?: unknown): void;
14
+ end(data?: string): void;
15
+ setHeader(key: string, value: string): ExpressStyleResponse;
16
+ statusCode: number;
17
+ headers: Record<string, string>;
18
+ }
19
+ /**
20
+ * Express-style request/response handler accepted by the RouteApp-compatibility
21
+ * route methods. Receives the parsed {@link SmrtRequest} and an
22
+ * {@link ExpressStyleResponse}.
23
+ */
24
+ type ExpressStyleHandler = (req: SmrtRequest, res: ExpressStyleResponse) => void;
2
25
  export declare class SmrtServer {
3
26
  private options;
4
27
  private routes;
@@ -10,19 +33,19 @@ export declare class SmrtServer {
10
33
  /**
11
34
  * Add GET route handler (RouteApp compatibility)
12
35
  */
13
- get(path: string, handler: (req: any, res: any) => void): void;
36
+ get(path: string, handler: ExpressStyleHandler): void;
14
37
  /**
15
38
  * Add POST route handler (RouteApp compatibility)
16
39
  */
17
- post(path: string, handler: (req: any, res: any) => void): void;
40
+ post(path: string, handler: ExpressStyleHandler): void;
18
41
  /**
19
42
  * Add PUT route handler (RouteApp compatibility)
20
43
  */
21
- put(path: string, handler: (req: any, res: any) => void): void;
44
+ put(path: string, handler: ExpressStyleHandler): void;
22
45
  /**
23
46
  * Add DELETE route handler (RouteApp compatibility)
24
47
  */
25
- delete(path: string, handler: (req: any, res: any) => void): void;
48
+ delete(path: string, handler: ExpressStyleHandler): void;
26
49
  /**
27
50
  * Convert Express-style handler to SMRT handler
28
51
  */
@@ -31,7 +54,7 @@ export declare class SmrtServer {
31
54
  * Start the server
32
55
  */
33
56
  start(): Promise<{
34
- server: any;
57
+ server: http.Server;
35
58
  url: string;
36
59
  }>;
37
60
  /**
@@ -89,4 +112,5 @@ export declare class SmrtServer {
89
112
  * Create a new SMRT server instance
90
113
  */
91
114
  export declare function createSmrtServer(options?: SmrtServerOptions): SmrtServer;
115
+ export {};
92
116
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAgB9D,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CACF;gBAEA,OAAO,GAAE,iBAAsB;IAU3C;;OAEG;IACH,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC;IAMlD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI9D;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI/D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI9D;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIjE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBpD;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInD;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,uBAAuB;IAyBrC;;OAEG;YACW,yBAAyB;IAwBvC;;OAEG;YACW,aAAa;IA8C3B;;OAEG;YACW,YAAY;IA8D1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,UAAU;IA8BlB;;OAEG;YACW,YAAY;IA+B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAI9D;;;;;;GAMG;AACH,UAAU,oBAAoB;IAC5B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAC;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;GAIG;AACH,KAAK,mBAAmB,GAAG,CACzB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,oBAAoB,KACtB,IAAI,CAAC;AAcV,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CACF;gBAEA,OAAO,GAAE,iBAAsB;IAU3C;;OAEG;IACH,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC;IAMlD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAIrD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAItD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAIrD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAIxD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAoB5D;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInD;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,uBAAuB;IAyBrC;;OAEG;YACW,yBAAyB;IAwBvC;;OAEG;YACW,aAAa;IA8C3B;;OAEG;YACW,YAAY;IA+D1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,UAAU;IA8BlB;;OAEG;YACW,YAAY;IA+B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
@@ -241,7 +241,7 @@ class SmrtServer {
241
241
  const url = new URL(request.url);
242
242
  const pathname = url.pathname;
243
243
  const routePath = pathname.startsWith(this.options.basePath) ? pathname.slice(this.options.basePath.length) : pathname;
244
- const query = {};
244
+ const query = /* @__PURE__ */ Object.create(null);
245
245
  url.searchParams.forEach((value, key) => {
246
246
  query[key] = value;
247
247
  });
@@ -331,14 +331,14 @@ class SmrtServer {
331
331
  switch (this.options.auth.type) {
332
332
  case "bearer": {
333
333
  const token = authHeader.replace("Bearer ", "");
334
- return this.options.auth.verify ? await this.options.auth.verify(token) : true;
334
+ return this.options.auth.verify ? Boolean(await this.options.auth.verify(token)) : true;
335
335
  }
336
336
  case "basic": {
337
337
  const credentials = authHeader.replace("Basic ", "");
338
- return this.options.auth.verify ? await this.options.auth.verify(credentials) : true;
338
+ return this.options.auth.verify ? Boolean(await this.options.auth.verify(credentials)) : true;
339
339
  }
340
340
  case "custom":
341
- return this.options.auth.verify ? await this.options.auth.verify(authHeader) : true;
341
+ return this.options.auth.verify ? Boolean(await this.options.auth.verify(authHeader)) : true;
342
342
  default:
343
343
  return false;
344
344
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../src/runtime/server.ts"],"sourcesContent":["/**\n * Runtime server implementation for SMRT auto-generated services\n */\n\nimport http from 'node:http';\nimport { createLogger } from '@happyvertical/logger';\nimport type { SmrtRequest, SmrtServerOptions } from './types';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Signals a malformed client request (e.g. invalid JSON body) so that\n * {@link SmrtServer.handleRequest} can answer 400 instead of a generic 500\n * (#1378). Internal to this module.\n */\nclass BadRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BadRequestError';\n }\n}\n\nexport class SmrtServer {\n private options: Required<SmrtServerOptions>;\n private routes: Map<string, (req: SmrtRequest) => Promise<Response>> =\n new Map();\n\n constructor(options: SmrtServerOptions = {}) {\n this.options = {\n port: 3000,\n hostname: 'localhost',\n basePath: '/api/v1',\n cors: true,\n ...options,\n } as Required<SmrtServerOptions>;\n }\n\n /**\n * Add a route handler\n */\n addRoute(\n method: string,\n path: string,\n handler: (req: SmrtRequest) => Promise<Response>,\n ) {\n const key = `${method.toUpperCase()} ${path}`;\n this.routes.set(key, handler);\n }\n\n /**\n * Add GET route handler (RouteApp compatibility)\n */\n get(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('GET', path, handler);\n }\n\n /**\n * Add POST route handler (RouteApp compatibility)\n */\n post(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('POST', path, handler);\n }\n\n /**\n * Add PUT route handler (RouteApp compatibility)\n */\n put(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('PUT', path, handler);\n }\n\n /**\n * Add DELETE route handler (RouteApp compatibility)\n */\n delete(path: string, handler: (req: any, res: any) => void): void {\n this.addExpressStyleRoute('DELETE', path, handler);\n }\n\n /**\n * Convert Express-style handler to SMRT handler\n */\n private addExpressStyleRoute(\n method: string,\n path: string,\n handler: (req: any, res: any) => void,\n ) {\n const smrtHandler = async (req: SmrtRequest): Promise<Response> => {\n return new Promise((resolve, reject) => {\n // Tracks whether the handler ever produced a response. A handler that\n // returns/resolves without calling json/send/end would otherwise leave\n // this promise pending forever (server hang) — we 500 instead (#1378).\n let settled = false;\n const settle = (response: Response) => {\n if (settled) return;\n settled = true;\n resolve(response);\n };\n const fail = (error: unknown) => {\n if (settled) return;\n settled = true;\n reject(error);\n };\n // Create Express-style response object\n const res = {\n status: (code: number) => {\n res.statusCode = code;\n return res;\n },\n json: (data: any) => {\n settle(\n new Response(JSON.stringify(data), {\n status: res.statusCode || 200,\n headers: {\n 'Content-Type': 'application/json',\n ...res.headers,\n },\n }),\n );\n },\n send: (data: any) => {\n const body = typeof data === 'string' ? data : JSON.stringify(data);\n settle(\n new Response(body, {\n status: res.statusCode || 200,\n headers: {\n 'Content-Type':\n typeof data === 'string'\n ? 'text/plain'\n : 'application/json',\n ...res.headers,\n },\n }),\n );\n },\n end: (data?: any) => {\n settle(\n new Response(data || '', {\n status: res.statusCode || 200,\n headers: res.headers,\n }),\n );\n },\n setHeader: (key: string, value: string) => {\n if (!res.headers) res.headers = {};\n res.headers[key] = value;\n return res;\n },\n statusCode: 200,\n headers: {} as Record<string, string>,\n };\n\n // Await the handler so async rejections propagate. Express-style\n // handlers signal completion via res.json/send/end; a sync throw or an\n // async rejection is surfaced as 500 by handleRequest. Promise.resolve\n // wraps both sync and async handlers uniformly (#1378).\n Promise.resolve()\n .then(() => handler(req, res))\n .then(() => {\n // Handler completed without producing a response (never called\n // json/send/end). Resolve a 500 rather than hanging forever.\n if (!settled) {\n settle(\n new Response('Internal Server Error', {\n status: 500,\n }),\n );\n }\n })\n .catch((error) => fail(error));\n });\n };\n\n this.addRoute(method, path, smrtHandler);\n }\n\n /**\n * Start the server\n */\n async start(): Promise<{ server: any; url: string }> {\n const server = http.createServer(async (req, res) => {\n try {\n const request = await this.nodeRequestToWebRequest(req);\n const response = await this.handleRequest(request);\n await this.webResponseToNodeResponse(response, res);\n } catch (_error) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n }\n });\n\n server.listen(this.options.port, this.options.hostname);\n\n const url = `http://${this.options.hostname}:${this.options.port}`;\n logger.info(`[smrt] Server started at ${url}`);\n\n return { server, url };\n }\n\n /**\n * Dispatch a request in-process and return the Response, without binding a\n * socket. Supported public entry point for embedding the router and for\n * tests that exercise routing/auth/CORS without spawning an HTTP server.\n */\n async dispatch(request: Request): Promise<Response> {\n return this.handleRequest(request);\n }\n\n /**\n * Convert stream to string\n */\n private async streamToString(stream: http.IncomingMessage): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n /**\n * Convert Node.js IncomingMessage to Web Request\n */\n private async nodeRequestToWebRequest(\n req: http.IncomingMessage,\n ): Promise<Request> {\n const url = `http://${this.options.hostname}:${this.options.port}${req.url}`;\n const method = req.method || 'GET';\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n headers.set(key, Array.isArray(value) ? value[0] : value);\n }\n }\n\n let body: string | undefined;\n if (method !== 'GET' && method !== 'HEAD') {\n body = await this.streamToString(req);\n }\n\n return new Request(url, {\n method,\n headers,\n body,\n });\n }\n\n /**\n * Convert Web Response to Node.js ServerResponse\n */\n private async webResponseToNodeResponse(\n webResponse: Response,\n res: http.ServerResponse,\n ): Promise<void> {\n res.statusCode = webResponse.status;\n\n // Set headers\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Send body\n if (webResponse.body) {\n const reader = webResponse.body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n\n res.end();\n }\n\n /**\n * Handle incoming requests\n */\n private async handleRequest(request: Request): Promise<Response> {\n try {\n // Handle CORS\n if (this.options.cors && request.method === 'OPTIONS') {\n return this.createCorsResponse();\n }\n\n // Parse request\n const smrtRequest = await this.parseRequest(request);\n\n // Check authentication\n if (this.options.auth) {\n const authResult = await this.authenticate(smrtRequest);\n if (!authResult) {\n return new Response('Unauthorized', { status: 401 });\n }\n }\n\n // Find matching route\n const routeKey = `${request.method} ${smrtRequest.url}`;\n const handler = this.findRouteHandler(routeKey);\n\n if (!handler) {\n return new Response('Not Found', { status: 404 });\n }\n\n // Execute handler\n const response = await handler(smrtRequest);\n\n // Add CORS headers if needed\n if (this.options.cors) {\n this.addCorsHeaders(response);\n }\n\n return response;\n } catch (error) {\n // A malformed request (e.g. invalid JSON body) is the client's fault →\n // 400, not 500 (#1378).\n if (error instanceof BadRequestError) {\n return new Response(error.message, { status: 400 });\n }\n logger.error('[smrt] Request error', { error });\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n\n /**\n * Parse incoming request into SmrtRequest format\n */\n private async parseRequest(request: Request): Promise<SmrtRequest> {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Remove base path\n const routePath = pathname.startsWith(this.options.basePath)\n ? pathname.slice(this.options.basePath.length)\n : pathname;\n\n // Parse query parameters\n const query: Record<string, any> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n // Parse body if present. `request.body` is a stream and stays truthy even\n // for an empty body, so reading text first lets us treat an empty body as\n // \"no body\" (undefined) and surface only genuinely malformed JSON as a 400\n // rather than letting request.json() throw a generic 500 (#1378).\n let body: any;\n if (\n request.body &&\n (request.method === 'POST' ||\n request.method === 'PUT' ||\n request.method === 'PATCH')\n ) {\n const contentType = request.headers.get('content-type') || '';\n const rawBody = await request.text();\n if (rawBody.trim() === '') {\n // Empty body → no body. Leave `body` undefined.\n } else if (contentType.includes('application/json')) {\n try {\n body = JSON.parse(rawBody);\n } catch (error) {\n throw new BadRequestError(\n `Invalid JSON request body: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n } else {\n body = rawBody;\n }\n }\n\n // Extract headers\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n params: {}, // Will be populated by route matching\n query,\n body,\n headers,\n method: request.method,\n url: routePath,\n json: async () => body,\n };\n }\n\n /**\n * Find route handler with parameter extraction\n */\n private findRouteHandler(\n routeKey: string,\n ): ((req: SmrtRequest) => Promise<Response>) | undefined {\n // First try exact match\n if (this.routes.has(routeKey)) {\n return this.routes.get(routeKey);\n }\n\n // Try parameter matching\n const [method, path] = routeKey.split(' ', 2);\n\n for (const [key, handler] of this.routes.entries()) {\n const [routeMethod, routePath] = key.split(' ', 2);\n\n if (method === routeMethod) {\n const params = this.matchRoute(path, routePath);\n if (params !== null) {\n // Return wrapped handler that injects params\n return async (req: SmrtRequest) => {\n req.params = params;\n return handler(req);\n };\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Match route path with parameters (e.g., /users/:id)\n */\n private matchRoute(\n requestPath: string,\n routePath: string,\n ): Record<string, string> | null {\n const requestSegments = requestPath.split('/').filter((s) => s);\n const routeSegments = routePath.split('/').filter((s) => s);\n\n if (requestSegments.length !== routeSegments.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < routeSegments.length; i++) {\n const routeSegment = routeSegments[i];\n const requestSegment = requestSegments[i];\n\n if (routeSegment.startsWith(':')) {\n // Parameter segment\n const paramName = routeSegment.slice(1);\n params[paramName] = requestSegment;\n } else if (routeSegment !== requestSegment) {\n // Literal segment mismatch\n return null;\n }\n }\n\n return params;\n }\n\n /**\n * Handle authentication\n */\n private async authenticate(request: SmrtRequest): Promise<boolean> {\n if (!this.options.auth) return true;\n\n const authHeader = request.headers.authorization;\n if (!authHeader) return false;\n\n switch (this.options.auth.type) {\n case 'bearer': {\n const token = authHeader.replace('Bearer ', '');\n return this.options.auth.verify\n ? await this.options.auth.verify(token)\n : true;\n }\n\n case 'basic': {\n const credentials = authHeader.replace('Basic ', '');\n return this.options.auth.verify\n ? await this.options.auth.verify(credentials)\n : true;\n }\n\n case 'custom':\n return this.options.auth.verify\n ? await this.options.auth.verify(authHeader)\n : true;\n\n default:\n return false;\n }\n }\n\n /**\n * Create CORS preflight response\n */\n private createCorsResponse(): Response {\n return new Response(null, {\n status: 204,\n headers: this.getCorsHeaders(),\n });\n }\n\n /**\n * Add CORS headers to response\n */\n private addCorsHeaders(response: Response): void {\n const corsHeaders = this.getCorsHeaders();\n Object.entries(corsHeaders).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n }\n\n /**\n * Get CORS headers\n */\n private getCorsHeaders(): Record<string, string> {\n const corsConfig = this.options.cors;\n\n if (typeof corsConfig === 'boolean') {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n };\n }\n\n return {\n 'Access-Control-Allow-Origin': Array.isArray(corsConfig.origin)\n ? corsConfig.origin.join(', ')\n : corsConfig.origin || '*',\n 'Access-Control-Allow-Methods':\n corsConfig.methods?.join(', ') || 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers':\n corsConfig.headers?.join(', ') || 'Content-Type, Authorization',\n };\n }\n}\n\n/**\n * Create a new SMRT server instance\n */\nexport function createSmrtServer(options?: SmrtServerOptions): SmrtServer {\n return new SmrtServer(options);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sources":["../../src/runtime/server.ts"],"sourcesContent":["/**\n * Runtime server implementation for SMRT auto-generated services\n */\n\nimport http from 'node:http';\nimport { createLogger } from '@happyvertical/logger';\nimport type { SmrtRequest, SmrtServerOptions } from './types';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Express-style response object handed to RouteApp-compatibility handlers\n * (registered via {@link SmrtServer.get}/`post`/`put`/`delete`). It mirrors the\n * subset of the Express `res` API that {@link SmrtServer.addExpressStyleRoute}\n * constructs; each terminal method (`json`/`send`/`end`) resolves the wrapped\n * SMRT handler with a Web {@link Response}.\n */\ninterface ExpressStyleResponse {\n status(code: number): ExpressStyleResponse;\n json(data: unknown): void;\n send(data?: unknown): void;\n end(data?: string): void;\n setHeader(key: string, value: string): ExpressStyleResponse;\n statusCode: number;\n headers: Record<string, string>;\n}\n\n/**\n * Express-style request/response handler accepted by the RouteApp-compatibility\n * route methods. Receives the parsed {@link SmrtRequest} and an\n * {@link ExpressStyleResponse}.\n */\ntype ExpressStyleHandler = (\n req: SmrtRequest,\n res: ExpressStyleResponse,\n) => void;\n\n/**\n * Signals a malformed client request (e.g. invalid JSON body) so that\n * {@link SmrtServer.handleRequest} can answer 400 instead of a generic 500\n * (#1378). Internal to this module.\n */\nclass BadRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BadRequestError';\n }\n}\n\nexport class SmrtServer {\n private options: Required<SmrtServerOptions>;\n private routes: Map<string, (req: SmrtRequest) => Promise<Response>> =\n new Map();\n\n constructor(options: SmrtServerOptions = {}) {\n this.options = {\n port: 3000,\n hostname: 'localhost',\n basePath: '/api/v1',\n cors: true,\n ...options,\n } as Required<SmrtServerOptions>;\n }\n\n /**\n * Add a route handler\n */\n addRoute(\n method: string,\n path: string,\n handler: (req: SmrtRequest) => Promise<Response>,\n ) {\n const key = `${method.toUpperCase()} ${path}`;\n this.routes.set(key, handler);\n }\n\n /**\n * Add GET route handler (RouteApp compatibility)\n */\n get(path: string, handler: ExpressStyleHandler): void {\n this.addExpressStyleRoute('GET', path, handler);\n }\n\n /**\n * Add POST route handler (RouteApp compatibility)\n */\n post(path: string, handler: ExpressStyleHandler): void {\n this.addExpressStyleRoute('POST', path, handler);\n }\n\n /**\n * Add PUT route handler (RouteApp compatibility)\n */\n put(path: string, handler: ExpressStyleHandler): void {\n this.addExpressStyleRoute('PUT', path, handler);\n }\n\n /**\n * Add DELETE route handler (RouteApp compatibility)\n */\n delete(path: string, handler: ExpressStyleHandler): void {\n this.addExpressStyleRoute('DELETE', path, handler);\n }\n\n /**\n * Convert Express-style handler to SMRT handler\n */\n private addExpressStyleRoute(\n method: string,\n path: string,\n handler: ExpressStyleHandler,\n ) {\n const smrtHandler = async (req: SmrtRequest): Promise<Response> => {\n return new Promise((resolve, reject) => {\n // Tracks whether the handler ever produced a response. A handler that\n // returns/resolves without calling json/send/end would otherwise leave\n // this promise pending forever (server hang) — we 500 instead (#1378).\n let settled = false;\n const settle = (response: Response) => {\n if (settled) return;\n settled = true;\n resolve(response);\n };\n const fail = (error: unknown) => {\n if (settled) return;\n settled = true;\n reject(error);\n };\n // Create Express-style response object\n const res: ExpressStyleResponse = {\n status: (code: number) => {\n res.statusCode = code;\n return res;\n },\n json: (data: unknown) => {\n settle(\n new Response(JSON.stringify(data), {\n status: res.statusCode || 200,\n headers: {\n 'Content-Type': 'application/json',\n ...res.headers,\n },\n }),\n );\n },\n send: (data?: unknown) => {\n const body = typeof data === 'string' ? data : JSON.stringify(data);\n settle(\n new Response(body, {\n status: res.statusCode || 200,\n headers: {\n 'Content-Type':\n typeof data === 'string'\n ? 'text/plain'\n : 'application/json',\n ...res.headers,\n },\n }),\n );\n },\n end: (data?: string) => {\n settle(\n new Response(data || '', {\n status: res.statusCode || 200,\n headers: res.headers,\n }),\n );\n },\n setHeader: (key: string, value: string) => {\n if (!res.headers) res.headers = {};\n res.headers[key] = value;\n return res;\n },\n statusCode: 200,\n headers: {} as Record<string, string>,\n };\n\n // Await the handler so async rejections propagate. Express-style\n // handlers signal completion via res.json/send/end; a sync throw or an\n // async rejection is surfaced as 500 by handleRequest. Promise.resolve\n // wraps both sync and async handlers uniformly (#1378).\n Promise.resolve()\n .then(() => handler(req, res))\n .then(() => {\n // Handler completed without producing a response (never called\n // json/send/end). Resolve a 500 rather than hanging forever.\n if (!settled) {\n settle(\n new Response('Internal Server Error', {\n status: 500,\n }),\n );\n }\n })\n .catch((error) => fail(error));\n });\n };\n\n this.addRoute(method, path, smrtHandler);\n }\n\n /**\n * Start the server\n */\n async start(): Promise<{ server: http.Server; url: string }> {\n const server = http.createServer(async (req, res) => {\n try {\n const request = await this.nodeRequestToWebRequest(req);\n const response = await this.handleRequest(request);\n await this.webResponseToNodeResponse(response, res);\n } catch (_error) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n }\n });\n\n server.listen(this.options.port, this.options.hostname);\n\n const url = `http://${this.options.hostname}:${this.options.port}`;\n logger.info(`[smrt] Server started at ${url}`);\n\n return { server, url };\n }\n\n /**\n * Dispatch a request in-process and return the Response, without binding a\n * socket. Supported public entry point for embedding the router and for\n * tests that exercise routing/auth/CORS without spawning an HTTP server.\n */\n async dispatch(request: Request): Promise<Response> {\n return this.handleRequest(request);\n }\n\n /**\n * Convert stream to string\n */\n private async streamToString(stream: http.IncomingMessage): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n\n /**\n * Convert Node.js IncomingMessage to Web Request\n */\n private async nodeRequestToWebRequest(\n req: http.IncomingMessage,\n ): Promise<Request> {\n const url = `http://${this.options.hostname}:${this.options.port}${req.url}`;\n const method = req.method || 'GET';\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n headers.set(key, Array.isArray(value) ? value[0] : value);\n }\n }\n\n let body: string | undefined;\n if (method !== 'GET' && method !== 'HEAD') {\n body = await this.streamToString(req);\n }\n\n return new Request(url, {\n method,\n headers,\n body,\n });\n }\n\n /**\n * Convert Web Response to Node.js ServerResponse\n */\n private async webResponseToNodeResponse(\n webResponse: Response,\n res: http.ServerResponse,\n ): Promise<void> {\n res.statusCode = webResponse.status;\n\n // Set headers\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Send body\n if (webResponse.body) {\n const reader = webResponse.body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n\n res.end();\n }\n\n /**\n * Handle incoming requests\n */\n private async handleRequest(request: Request): Promise<Response> {\n try {\n // Handle CORS\n if (this.options.cors && request.method === 'OPTIONS') {\n return this.createCorsResponse();\n }\n\n // Parse request\n const smrtRequest = await this.parseRequest(request);\n\n // Check authentication\n if (this.options.auth) {\n const authResult = await this.authenticate(smrtRequest);\n if (!authResult) {\n return new Response('Unauthorized', { status: 401 });\n }\n }\n\n // Find matching route\n const routeKey = `${request.method} ${smrtRequest.url}`;\n const handler = this.findRouteHandler(routeKey);\n\n if (!handler) {\n return new Response('Not Found', { status: 404 });\n }\n\n // Execute handler\n const response = await handler(smrtRequest);\n\n // Add CORS headers if needed\n if (this.options.cors) {\n this.addCorsHeaders(response);\n }\n\n return response;\n } catch (error) {\n // A malformed request (e.g. invalid JSON body) is the client's fault →\n // 400, not 500 (#1378).\n if (error instanceof BadRequestError) {\n return new Response(error.message, { status: 400 });\n }\n logger.error('[smrt] Request error', { error });\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n\n /**\n * Parse incoming request into SmrtRequest format\n */\n private async parseRequest(request: Request): Promise<SmrtRequest> {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Remove base path\n const routePath = pathname.startsWith(this.options.basePath)\n ? pathname.slice(this.options.basePath.length)\n : pathname;\n\n // Parse query parameters into a null-prototype dictionary so untrusted\n // keys (`__proto__`, `constructor`) can't pollute Object.prototype.\n const query: Record<string, string> = Object.create(null);\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n // Parse body if present. `request.body` is a stream and stays truthy even\n // for an empty body, so reading text first lets us treat an empty body as\n // \"no body\" (undefined) and surface only genuinely malformed JSON as a 400\n // rather than letting request.json() throw a generic 500 (#1378).\n let body: unknown;\n if (\n request.body &&\n (request.method === 'POST' ||\n request.method === 'PUT' ||\n request.method === 'PATCH')\n ) {\n const contentType = request.headers.get('content-type') || '';\n const rawBody = await request.text();\n if (rawBody.trim() === '') {\n // Empty body → no body. Leave `body` undefined.\n } else if (contentType.includes('application/json')) {\n try {\n body = JSON.parse(rawBody);\n } catch (error) {\n throw new BadRequestError(\n `Invalid JSON request body: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n } else {\n body = rawBody;\n }\n }\n\n // Extract headers\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n params: {}, // Will be populated by route matching\n query,\n body,\n headers,\n method: request.method,\n url: routePath,\n json: async () => body,\n };\n }\n\n /**\n * Find route handler with parameter extraction\n */\n private findRouteHandler(\n routeKey: string,\n ): ((req: SmrtRequest) => Promise<Response>) | undefined {\n // First try exact match\n if (this.routes.has(routeKey)) {\n return this.routes.get(routeKey);\n }\n\n // Try parameter matching\n const [method, path] = routeKey.split(' ', 2);\n\n for (const [key, handler] of this.routes.entries()) {\n const [routeMethod, routePath] = key.split(' ', 2);\n\n if (method === routeMethod) {\n const params = this.matchRoute(path, routePath);\n if (params !== null) {\n // Return wrapped handler that injects params\n return async (req: SmrtRequest) => {\n req.params = params;\n return handler(req);\n };\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Match route path with parameters (e.g., /users/:id)\n */\n private matchRoute(\n requestPath: string,\n routePath: string,\n ): Record<string, string> | null {\n const requestSegments = requestPath.split('/').filter((s) => s);\n const routeSegments = routePath.split('/').filter((s) => s);\n\n if (requestSegments.length !== routeSegments.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < routeSegments.length; i++) {\n const routeSegment = routeSegments[i];\n const requestSegment = requestSegments[i];\n\n if (routeSegment.startsWith(':')) {\n // Parameter segment\n const paramName = routeSegment.slice(1);\n params[paramName] = requestSegment;\n } else if (routeSegment !== requestSegment) {\n // Literal segment mismatch\n return null;\n }\n }\n\n return params;\n }\n\n /**\n * Handle authentication\n */\n private async authenticate(request: SmrtRequest): Promise<boolean> {\n if (!this.options.auth) return true;\n\n const authHeader = request.headers.authorization;\n if (!authHeader) return false;\n\n switch (this.options.auth.type) {\n case 'bearer': {\n const token = authHeader.replace('Bearer ', '');\n return this.options.auth.verify\n ? Boolean(await this.options.auth.verify(token))\n : true;\n }\n\n case 'basic': {\n const credentials = authHeader.replace('Basic ', '');\n return this.options.auth.verify\n ? Boolean(await this.options.auth.verify(credentials))\n : true;\n }\n\n case 'custom':\n return this.options.auth.verify\n ? Boolean(await this.options.auth.verify(authHeader))\n : true;\n\n default:\n return false;\n }\n }\n\n /**\n * Create CORS preflight response\n */\n private createCorsResponse(): Response {\n return new Response(null, {\n status: 204,\n headers: this.getCorsHeaders(),\n });\n }\n\n /**\n * Add CORS headers to response\n */\n private addCorsHeaders(response: Response): void {\n const corsHeaders = this.getCorsHeaders();\n Object.entries(corsHeaders).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n }\n\n /**\n * Get CORS headers\n */\n private getCorsHeaders(): Record<string, string> {\n const corsConfig = this.options.cors;\n\n if (typeof corsConfig === 'boolean') {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n };\n }\n\n return {\n 'Access-Control-Allow-Origin': Array.isArray(corsConfig.origin)\n ? corsConfig.origin.join(', ')\n : corsConfig.origin || '*',\n 'Access-Control-Allow-Methods':\n corsConfig.methods?.join(', ') || 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers':\n corsConfig.headers?.join(', ') || 'Content-Type, Authorization',\n };\n }\n}\n\n/**\n * Create a new SMRT server instance\n */\nexport function createSmrtServer(options?: SmrtServerOptions): SmrtServer {\n return new SmrtServer(options);\n}\n"],"names":[],"mappings":";;AAQA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAkC7C,MAAM,wBAAwB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,WAAW;AAAA,EACd;AAAA,EACA,6BACF,IAAA;AAAA,EAEN,YAAY,UAA6B,IAAI;AAC3C,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,QACA,MACA,SACA;AACA,UAAM,MAAM,GAAG,OAAO,YAAA,CAAa,IAAI,IAAI;AAC3C,SAAK,OAAO,IAAI,KAAK,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc,SAAoC;AACpD,SAAK,qBAAqB,OAAO,MAAM,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,MAAc,SAAoC;AACrD,SAAK,qBAAqB,QAAQ,MAAM,OAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc,SAAoC;AACpD,SAAK,qBAAqB,OAAO,MAAM,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAc,SAAoC;AACvD,SAAK,qBAAqB,UAAU,MAAM,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBACN,QACA,MACA,SACA;AACA,UAAM,cAAc,OAAO,QAAwC;AACjE,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAItC,YAAI,UAAU;AACd,cAAM,SAAS,CAAC,aAAuB;AACrC,cAAI,QAAS;AACb,oBAAU;AACV,kBAAQ,QAAQ;AAAA,QAClB;AACA,cAAM,OAAO,CAAC,UAAmB;AAC/B,cAAI,QAAS;AACb,oBAAU;AACV,iBAAO,KAAK;AAAA,QACd;AAEA,cAAM,MAA4B;AAAA,UAChC,QAAQ,CAAC,SAAiB;AACxB,gBAAI,aAAa;AACjB,mBAAO;AAAA,UACT;AAAA,UACA,MAAM,CAAC,SAAkB;AACvB;AAAA,cACE,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,gBACjC,QAAQ,IAAI,cAAc;AAAA,gBAC1B,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,GAAG,IAAI;AAAA,gBAAA;AAAA,cACT,CACD;AAAA,YAAA;AAAA,UAEL;AAAA,UACA,MAAM,CAAC,SAAmB;AACxB,kBAAM,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI;AAClE;AAAA,cACE,IAAI,SAAS,MAAM;AAAA,gBACjB,QAAQ,IAAI,cAAc;AAAA,gBAC1B,SAAS;AAAA,kBACP,gBACE,OAAO,SAAS,WACZ,eACA;AAAA,kBACN,GAAG,IAAI;AAAA,gBAAA;AAAA,cACT,CACD;AAAA,YAAA;AAAA,UAEL;AAAA,UACA,KAAK,CAAC,SAAkB;AACtB;AAAA,cACE,IAAI,SAAS,QAAQ,IAAI;AAAA,gBACvB,QAAQ,IAAI,cAAc;AAAA,gBAC1B,SAAS,IAAI;AAAA,cAAA,CACd;AAAA,YAAA;AAAA,UAEL;AAAA,UACA,WAAW,CAAC,KAAa,UAAkB;AACzC,gBAAI,CAAC,IAAI,QAAS,KAAI,UAAU,CAAA;AAChC,gBAAI,QAAQ,GAAG,IAAI;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ,SAAS,CAAA;AAAA,QAAC;AAOZ,gBAAQ,UACL,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC,EAC5B,KAAK,MAAM;AAGV,cAAI,CAAC,SAAS;AACZ;AAAA,cACE,IAAI,SAAS,yBAAyB;AAAA,gBACpC,QAAQ;AAAA,cAAA,CACT;AAAA,YAAA;AAAA,UAEL;AAAA,QACF,CAAC,EACA,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,SAAK,SAAS,QAAQ,MAAM,WAAW;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuD;AAC3D,UAAM,SAAS,KAAK,aAAa,OAAO,KAAK,QAAQ;AACnD,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,wBAAwB,GAAG;AACtD,cAAM,WAAW,MAAM,KAAK,cAAc,OAAO;AACjD,cAAM,KAAK,0BAA0B,UAAU,GAAG;AAAA,MACpD,SAAS,QAAQ;AACf,YAAI,aAAa;AACjB,YAAI,IAAI,uBAAuB;AAAA,MACjC;AAAA,IACF,CAAC;AAED,WAAO,OAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AAEtD,UAAM,MAAM,UAAU,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,IAAI;AAChE,WAAO,KAAK,4BAA4B,GAAG,EAAE;AAE7C,WAAO,EAAE,QAAQ,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,SAAqC;AAClD,WAAO,KAAK,cAAc,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,QAA+C;AAC1E,UAAM,SAAmB,CAAA;AACzB,qBAAiB,SAAS,QAAQ;AAChC,aAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,IACjE;AACA,WAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBACZ,KACkB;AAClB,UAAM,MAAM,UAAU,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG;AAC1E,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,UAAU,IAAI,QAAA;AAEpB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACtD,UAAI,OAAO;AACT,gBAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA,MAC1D;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,aAAO,MAAM,KAAK,eAAe,GAAG;AAAA,IACtC;AAEA,WAAO,IAAI,QAAQ,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BACZ,aACA,KACe;AACf,QAAI,aAAa,YAAY;AAG7B,gBAAY,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC1C,UAAI,UAAU,KAAK,KAAK;AAAA,IAC1B,CAAC;AAGD,QAAI,YAAY,MAAM;AACpB,YAAM,SAAS,YAAY,KAAK,UAAA;AAChC,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AACrC,YAAI,KAAM;AACV,YAAI,MAAM,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,IAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,SAAqC;AAC/D,QAAI;AAEF,UAAI,KAAK,QAAQ,QAAQ,QAAQ,WAAW,WAAW;AACrD,eAAO,KAAK,mBAAA;AAAA,MACd;AAGA,YAAM,cAAc,MAAM,KAAK,aAAa,OAAO;AAGnD,UAAI,KAAK,QAAQ,MAAM;AACrB,cAAM,aAAa,MAAM,KAAK,aAAa,WAAW;AACtD,YAAI,CAAC,YAAY;AACf,iBAAO,IAAI,SAAS,gBAAgB,EAAE,QAAQ,KAAK;AAAA,QACrD;AAAA,MACF;AAGA,YAAM,WAAW,GAAG,QAAQ,MAAM,IAAI,YAAY,GAAG;AACrD,YAAM,UAAU,KAAK,iBAAiB,QAAQ;AAE9C,UAAI,CAAC,SAAS;AACZ,eAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK;AAAA,MAClD;AAGA,YAAM,WAAW,MAAM,QAAQ,WAAW;AAG1C,UAAI,KAAK,QAAQ,MAAM;AACrB,aAAK,eAAe,QAAQ;AAAA,MAC9B;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAGd,UAAI,iBAAiB,iBAAiB;AACpC,eAAO,IAAI,SAAS,MAAM,SAAS,EAAE,QAAQ,KAAK;AAAA,MACpD;AACA,aAAO,MAAM,wBAAwB,EAAE,MAAA,CAAO;AAC9C,aAAO,IAAI,SAAS,yBAAyB,EAAE,QAAQ,KAAK;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAwC;AACjE,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAAW,IAAI;AAGrB,UAAM,YAAY,SAAS,WAAW,KAAK,QAAQ,QAAQ,IACvD,SAAS,MAAM,KAAK,QAAQ,SAAS,MAAM,IAC3C;AAIJ,UAAM,QAAgC,uBAAO,OAAO,IAAI;AACxD,QAAI,aAAa,QAAQ,CAAC,OAAO,QAAQ;AACvC,YAAM,GAAG,IAAI;AAAA,IACf,CAAC;AAMD,QAAI;AACJ,QACE,QAAQ,SACP,QAAQ,WAAW,UAClB,QAAQ,WAAW,SACnB,QAAQ,WAAW,UACrB;AACA,YAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,KAAK;AAC3D,YAAM,UAAU,MAAM,QAAQ,KAAA;AAC9B,UAAI,QAAQ,KAAA,MAAW,GAAI;AAAA,eAEhB,YAAY,SAAS,kBAAkB,GAAG;AACnD,YAAI;AACF,iBAAO,KAAK,MAAM,OAAO;AAAA,QAC3B,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,8BACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,UAAkC,CAAA;AACxC,YAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACtC,cAAQ,GAAG,IAAI;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,MACL,QAAQ,CAAA;AAAA;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,KAAK;AAAA,MACL,MAAM,YAAY;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,UACuD;AAEvD,QAAI,KAAK,OAAO,IAAI,QAAQ,GAAG;AAC7B,aAAO,KAAK,OAAO,IAAI,QAAQ;AAAA,IACjC;AAGA,UAAM,CAAC,QAAQ,IAAI,IAAI,SAAS,MAAM,KAAK,CAAC;AAE5C,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,WAAW;AAClD,YAAM,CAAC,aAAa,SAAS,IAAI,IAAI,MAAM,KAAK,CAAC;AAEjD,UAAI,WAAW,aAAa;AAC1B,cAAM,SAAS,KAAK,WAAW,MAAM,SAAS;AAC9C,YAAI,WAAW,MAAM;AAEnB,iBAAO,OAAO,QAAqB;AACjC,gBAAI,SAAS;AACb,mBAAO,QAAQ,GAAG;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WACN,aACA,WAC+B;AAC/B,UAAM,kBAAkB,YAAY,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC;AAC9D,UAAM,gBAAgB,UAAU,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC;AAE1D,QAAI,gBAAgB,WAAW,cAAc,QAAQ;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,SAAiC,CAAA;AAEvC,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,YAAM,eAAe,cAAc,CAAC;AACpC,YAAM,iBAAiB,gBAAgB,CAAC;AAExC,UAAI,aAAa,WAAW,GAAG,GAAG;AAEhC,cAAM,YAAY,aAAa,MAAM,CAAC;AACtC,eAAO,SAAS,IAAI;AAAA,MACtB,WAAW,iBAAiB,gBAAgB;AAE1C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAwC;AACjE,QAAI,CAAC,KAAK,QAAQ,KAAM,QAAO;AAE/B,UAAM,aAAa,QAAQ,QAAQ;AACnC,QAAI,CAAC,WAAY,QAAO;AAExB,YAAQ,KAAK,QAAQ,KAAK,MAAA;AAAA,MACxB,KAAK,UAAU;AACb,cAAM,QAAQ,WAAW,QAAQ,WAAW,EAAE;AAC9C,eAAO,KAAK,QAAQ,KAAK,SACrB,QAAQ,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK,CAAC,IAC7C;AAAA,MACN;AAAA,MAEA,KAAK,SAAS;AACZ,cAAM,cAAc,WAAW,QAAQ,UAAU,EAAE;AACnD,eAAO,KAAK,QAAQ,KAAK,SACrB,QAAQ,MAAM,KAAK,QAAQ,KAAK,OAAO,WAAW,CAAC,IACnD;AAAA,MACN;AAAA,MAEA,KAAK;AACH,eAAO,KAAK,QAAQ,KAAK,SACrB,QAAQ,MAAM,KAAK,QAAQ,KAAK,OAAO,UAAU,CAAC,IAClD;AAAA,MAEN;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAA+B;AACrC,WAAO,IAAI,SAAS,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,SAAS,KAAK,eAAA;AAAA,IAAe,CAC9B;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,UAA0B;AAC/C,UAAM,cAAc,KAAK,eAAA;AACzB,WAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACpD,eAAS,QAAQ,IAAI,KAAK,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAyC;AAC/C,UAAM,aAAa,KAAK,QAAQ;AAEhC,QAAI,OAAO,eAAe,WAAW;AACnC,aAAO;AAAA,QACL,+BAA+B;AAAA,QAC/B,gCAAgC;AAAA,QAChC,gCAAgC;AAAA,MAAA;AAAA,IAEpC;AAEA,WAAO;AAAA,MACL,+BAA+B,MAAM,QAAQ,WAAW,MAAM,IAC1D,WAAW,OAAO,KAAK,IAAI,IAC3B,WAAW,UAAU;AAAA,MACzB,gCACE,WAAW,SAAS,KAAK,IAAI,KAAK;AAAA,MACpC,gCACE,WAAW,SAAS,KAAK,IAAI,KAAK;AAAA,IAAA;AAAA,EAExC;AACF;AAKO,SAAS,iBAAiB,SAAyC;AACxE,SAAO,IAAI,WAAW,OAAO;AAC/B;"}
@@ -12,7 +12,7 @@ export interface SmrtServerOptions {
12
12
  };
13
13
  auth?: {
14
14
  type: 'bearer' | 'basic' | 'custom';
15
- verify?: (token: string) => Promise<boolean | any>;
15
+ verify?: (token: string) => Promise<unknown>;
16
16
  };
17
17
  }
18
18
  export interface SmrtClientOptions {
@@ -28,31 +28,31 @@ export interface SmrtClientOptions {
28
28
  }
29
29
  export interface SmrtRequest {
30
30
  params: Record<string, string>;
31
- query: Record<string, any>;
32
- body?: any;
31
+ query: Record<string, string>;
32
+ body?: unknown;
33
33
  headers: Record<string, string>;
34
34
  method: string;
35
35
  url: string;
36
- json(): Promise<any>;
36
+ json(): Promise<unknown>;
37
37
  }
38
38
  export interface SmrtResponse {
39
- json(data: any, init?: ResponseInit): Response;
39
+ json(data: unknown, init?: ResponseInit): Response;
40
40
  status(code: number): SmrtResponse;
41
- send(data?: any): Response;
41
+ send(data?: unknown): Response;
42
42
  }
43
43
  export interface CollectionInterface {
44
44
  list(options?: {
45
- where?: Record<string, any>;
45
+ where?: Record<string, unknown>;
46
46
  orderBy?: string | string[];
47
47
  limit?: number;
48
48
  offset?: number;
49
- }): Promise<any[]>;
50
- get(id: string): Promise<any | null>;
51
- create(data: any): Promise<any>;
52
- update(id: string, data: any): Promise<any | null>;
49
+ }): Promise<unknown[]>;
50
+ get(id: string): Promise<unknown | null>;
51
+ create(data: unknown): Promise<unknown>;
52
+ update(id: string, data: unknown): Promise<unknown | null>;
53
53
  delete(id: string): Promise<boolean>;
54
54
  count(options?: {
55
- where?: Record<string, any>;
55
+ where?: Record<string, unknown>;
56
56
  }): Promise<number>;
57
57
  }
58
58
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EACD,OAAO,GACP;QACE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACN,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;KACpD,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAErC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAEnD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EACD,OAAO,GACP;QACE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACN,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QAIpC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC9C,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IACnD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEvB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAEzC,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAE3D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE"}
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-06-26T20:55:09.916Z",
3
+ "generatedAt": "2026-06-27T01:14:00.669Z",
4
4
  "packageName": "@happyvertical/smrt-core",
5
- "packageVersion": "0.36.7",
5
+ "packageVersion": "0.36.8",
6
6
  "sourceManifestPath": "dist/manifest.json",
7
7
  "agentDocPath": "AGENTS.md",
8
8
  "sourceHashes": {
9
- "manifest": "b4b21cf2cc29fbdaf873bdd3d45dd877769dd6b430557ee724a2766045edd506",
10
- "packageJson": "9e3f9b75719e31278a21f95e0472cf1b2691dcf8337a178893b3c2fdf126d048",
9
+ "manifest": "f6d925123af81ea6f1dc386db1506f2be958e64c63477733123a97fdefbeb949",
10
+ "packageJson": "25e74d4d307a7ae5c9a780cbe3953464e5a652d32d00951ac8c85b804656c52d",
11
11
  "agents": "0fa157a078aa44a0bc104540bd27f0b1e52e66549b7994cba751438a8d44c827"
12
12
  },
13
13
  "exports": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-core",
3
- "version": "0.36.7",
3
+ "version": "0.36.8",
4
4
  "description": "Core AI agent framework with standardized collections, object-relational mapping, and code generators",
5
5
  "author": "HappyVertical",
6
6
  "type": "module",
@@ -153,9 +153,9 @@
153
153
  "tsx": "^4.21.0",
154
154
  "typescript": "^5.9.3",
155
155
  "yaml": "^2.8.2",
156
- "@happyvertical/smrt-config": "0.36.7",
157
- "@happyvertical/smrt-types": "0.36.7",
158
- "@happyvertical/smrt-scanner": "0.36.7"
156
+ "@happyvertical/smrt-types": "0.36.8",
157
+ "@happyvertical/smrt-config": "0.36.8",
158
+ "@happyvertical/smrt-scanner": "0.36.8"
159
159
  },
160
160
  "peerDependencies": {
161
161
  "@huggingface/transformers": ">=3.0.0 <4.0.0",