@happyvertical/smrt-core 0.36.7 → 0.37.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/dist/child-accessors.d.ts +1 -1
- package/dist/child-accessors.d.ts.map +1 -1
- package/dist/child-accessors.js +1 -1
- package/dist/child-accessors.js.map +1 -1
- package/dist/class.d.ts.map +1 -1
- package/dist/class.js +3 -1
- package/dist/class.js.map +1 -1
- package/dist/collection-cache.d.ts.map +1 -1
- package/dist/collection-cache.js +5 -3
- package/dist/collection-cache.js.map +1 -1
- package/dist/collection.d.ts +39 -16
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +40 -19
- package/dist/collection.js.map +1 -1
- package/dist/decorators/compatibility.d.ts +1 -1
- package/dist/decorators/compatibility.d.ts.map +1 -1
- package/dist/decorators/compatibility.js.map +1 -1
- package/dist/decorators/index.d.ts +4 -4
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js.map +1 -1
- package/dist/hierarchical.d.ts.map +1 -1
- package/dist/hierarchical.js.map +1 -1
- package/dist/junction.d.ts.map +1 -1
- package/dist/junction.js.map +1 -1
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +39 -20
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +2 -2
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest/test-manifest-stub.d.ts.map +1 -1
- package/dist/manifest/test-manifest-stub.js +2301 -629
- package/dist/manifest/test-manifest-stub.js.map +1 -1
- package/dist/manifest.json +39 -20
- package/dist/object.d.ts +64 -17
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +76 -30
- package/dist/object.js.map +1 -1
- package/dist/registry/class-registration.d.ts +3 -3
- package/dist/registry/class-registration.d.ts.map +1 -1
- package/dist/registry/class-registration.js +39 -42
- package/dist/registry/class-registration.js.map +1 -1
- package/dist/registry/inheritance-resolver.d.ts +17 -3
- package/dist/registry/inheritance-resolver.d.ts.map +1 -1
- package/dist/registry/inheritance-resolver.js +1 -1
- package/dist/registry/inheritance-resolver.js.map +1 -1
- package/dist/registry/manifest-field-merge.d.ts +17 -3
- package/dist/registry/manifest-field-merge.d.ts.map +1 -1
- package/dist/registry/manifest-field-merge.js +8 -6
- package/dist/registry/manifest-field-merge.js.map +1 -1
- package/dist/registry/schema-builder.d.ts +1 -1
- package/dist/registry/schema-builder.d.ts.map +1 -1
- package/dist/registry/schema-builder.js.map +1 -1
- package/dist/registry/shared-state.d.ts +3 -3
- package/dist/registry/shared-state.d.ts.map +1 -1
- package/dist/registry/shared-state.js.map +1 -1
- package/dist/registry/types.d.ts +78 -19
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/validator.d.ts +2 -1
- package/dist/registry/validator.d.ts.map +1 -1
- package/dist/registry/validator.js +38 -39
- package/dist/registry/validator.js.map +1 -1
- package/dist/registry.d.ts +84 -57
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +31 -25
- package/dist/registry.js.map +1 -1
- package/dist/runtime/client.d.ts +6 -6
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/mcp.d.ts +11 -4
- package/dist/runtime/mcp.d.ts.map +1 -1
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/server.d.ts +29 -5
- package/dist/runtime/server.d.ts.map +1 -1
- package/dist/runtime/server.js +4 -4
- package/dist/runtime/server.js.map +1 -1
- package/dist/runtime/types.d.ts +12 -12
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +5 -4
- package/dist/system-fields.d.ts +1 -1
- package/dist/system-fields.d.ts.map +1 -1
- package/dist/system-fields.js.map +1 -1
- package/package.json +4 -4
package/dist/runtime/client.d.ts
CHANGED
|
@@ -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?:
|
|
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,
|
|
12
|
+
get(path: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
13
13
|
/**
|
|
14
14
|
* POST request
|
|
15
15
|
*/
|
|
16
|
-
post(path: string, data?:
|
|
16
|
+
post(path: string, data?: unknown): Promise<unknown>;
|
|
17
17
|
/**
|
|
18
18
|
* PUT request
|
|
19
19
|
*/
|
|
20
|
-
put(path: string, data?:
|
|
20
|
+
put(path: string, data?: unknown): Promise<unknown>;
|
|
21
21
|
/**
|
|
22
22
|
* PATCH request
|
|
23
23
|
*/
|
|
24
|
-
patch(path: string, data?:
|
|
24
|
+
patch(path: string, data?: unknown): Promise<unknown>;
|
|
25
25
|
/**
|
|
26
26
|
* DELETE request
|
|
27
27
|
*/
|
|
28
|
-
delete(path: string): Promise<
|
|
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,
|
|
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
|
|
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;"}
|
package/dist/runtime/mcp.d.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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:
|
|
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:
|
|
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,
|
|
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"}
|
package/dist/runtime/mcp.js.map
CHANGED
|
@@ -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:
|
|
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;"}
|
package/dist/runtime/server.d.ts
CHANGED
|
@@ -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:
|
|
36
|
+
get(path: string, handler: ExpressStyleHandler): void;
|
|
14
37
|
/**
|
|
15
38
|
* Add POST route handler (RouteApp compatibility)
|
|
16
39
|
*/
|
|
17
|
-
post(path: string, handler:
|
|
40
|
+
post(path: string, handler: ExpressStyleHandler): void;
|
|
18
41
|
/**
|
|
19
42
|
* Add PUT route handler (RouteApp compatibility)
|
|
20
43
|
*/
|
|
21
|
-
put(path: string, handler:
|
|
44
|
+
put(path: string, handler: ExpressStyleHandler): void;
|
|
22
45
|
/**
|
|
23
46
|
* Add DELETE route handler (RouteApp compatibility)
|
|
24
47
|
*/
|
|
25
|
-
delete(path: string, handler:
|
|
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:
|
|
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;
|
|
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"}
|
package/dist/runtime/server.js
CHANGED
|
@@ -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":"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"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface SmrtServerOptions {
|
|
|
12
12
|
};
|
|
13
13
|
auth?: {
|
|
14
14
|
type: 'bearer' | 'basic' | 'custom';
|
|
15
|
-
verify?: (token: string) => Promise<
|
|
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,
|
|
32
|
-
body?:
|
|
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<
|
|
36
|
+
json(): Promise<unknown>;
|
|
37
37
|
}
|
|
38
38
|
export interface SmrtResponse {
|
|
39
|
-
json(data:
|
|
39
|
+
json(data: unknown, init?: ResponseInit): Response;
|
|
40
40
|
status(code: number): SmrtResponse;
|
|
41
|
-
send(data?:
|
|
41
|
+
send(data?: unknown): Response;
|
|
42
42
|
}
|
|
43
43
|
export interface CollectionInterface {
|
|
44
44
|
list(options?: {
|
|
45
|
-
where?: Record<string,
|
|
45
|
+
where?: Record<string, unknown>;
|
|
46
46
|
orderBy?: string | string[];
|
|
47
47
|
limit?: number;
|
|
48
48
|
offset?: number;
|
|
49
|
-
}): Promise<
|
|
50
|
-
get(id: string): Promise<
|
|
51
|
-
create(data:
|
|
52
|
-
update(id: string, data:
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/smrt-knowledge.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"generatedAt": "2026-06-
|
|
3
|
+
"generatedAt": "2026-06-28T21:50:13.218Z",
|
|
4
4
|
"packageName": "@happyvertical/smrt-core",
|
|
5
|
-
"packageVersion": "0.
|
|
5
|
+
"packageVersion": "0.37.0",
|
|
6
6
|
"sourceManifestPath": "dist/manifest.json",
|
|
7
7
|
"agentDocPath": "AGENTS.md",
|
|
8
8
|
"sourceHashes": {
|
|
9
|
-
"manifest": "
|
|
10
|
-
"packageJson": "
|
|
9
|
+
"manifest": "228c618bac6711779d5916ec5eb8dcf639cd2c839b2db9d7651efd4e6263a674",
|
|
10
|
+
"packageJson": "a9eccb9bd2f7403e3ce3b5b2f39f8f8152d7c69c78904e2c4bddd25b32711a6f",
|
|
11
11
|
"agents": "0fa157a078aa44a0bc104540bd27f0b1e52e66549b7994cba751438a8d44c827"
|
|
12
12
|
},
|
|
13
13
|
"exports": [
|
|
@@ -220,6 +220,7 @@
|
|
|
220
220
|
],
|
|
221
221
|
"relationships": [],
|
|
222
222
|
"methods": [
|
|
223
|
+
"_setLoadedRelationship",
|
|
223
224
|
"classifyConstraintError",
|
|
224
225
|
"clearEmbeddings",
|
|
225
226
|
"delete",
|
package/dist/system-fields.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import { FieldDefinition } from './scanner/types.js';
|
|
|
2
2
|
export declare const SMRT_SYSTEM_FIELDS: Readonly<Record<string, FieldDefinition>>;
|
|
3
3
|
export declare function isInjectedSmrtSystemField(field: unknown): boolean;
|
|
4
4
|
export declare function cloneSmrtSystemFields(): Record<string, FieldDefinition>;
|
|
5
|
-
export declare function prependSmrtSystemFields(fields: Map<string,
|
|
5
|
+
export declare function prependSmrtSystemFields<T extends FieldDefinition>(fields: Map<string, T>): Map<string, T>;
|
|
6
6
|
//# sourceMappingURL=system-fields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-fields.d.ts","sourceRoot":"","sources":["../src/system-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAsBrE,CAAC;AAEL,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIjE;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAWvE;AAED,wBAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"system-fields.d.ts","sourceRoot":"","sources":["../src/system-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAsBrE,CAAC;AAEL,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIjE;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAWvE;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,eAAe,EAC/D,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GACrB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAqBhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-fields.js","sources":["../src/system-fields.ts"],"sourcesContent":["/**\n * Canonical SMRT system fields inherited from `SmrtObject`.\n *\n * These fields exist on every persistent object at runtime even when they are\n * not declared in a child class manifest. Keep this definition lightweight:\n * presence matters for metadata consumers, while schema generation still owns\n * the exact SQL defaults and constraints for these columns.\n */\n\nimport type { FieldDefinition } from './scanner/types.js';\n\nexport const SMRT_SYSTEM_FIELDS: Readonly<Record<string, FieldDefinition>> =\n Object.freeze({\n id: Object.freeze({\n type: 'text',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n slug: Object.freeze({\n type: 'text',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n context: Object.freeze({\n type: 'text',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n created_at: Object.freeze({\n type: 'datetime',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n updated_at: Object.freeze({\n type: 'datetime',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n });\n\nexport function isInjectedSmrtSystemField(field: unknown): boolean {\n const meta = (field as { _meta?: { __smrtSystemField?: unknown } } | null)\n ?._meta;\n return Boolean(meta?.__smrtSystemField);\n}\n\nexport function cloneSmrtSystemFields(): Record<string, FieldDefinition> {\n const fields: Record<string, FieldDefinition> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(SMRT_SYSTEM_FIELDS)) {\n fields[fieldName] = {\n ...fieldDef,\n _meta: { ...(fieldDef._meta || {}) },\n };\n }\n\n return fields;\n}\n\nexport function prependSmrtSystemFields(\n fields: Map<string,
|
|
1
|
+
{"version":3,"file":"system-fields.js","sources":["../src/system-fields.ts"],"sourcesContent":["/**\n * Canonical SMRT system fields inherited from `SmrtObject`.\n *\n * These fields exist on every persistent object at runtime even when they are\n * not declared in a child class manifest. Keep this definition lightweight:\n * presence matters for metadata consumers, while schema generation still owns\n * the exact SQL defaults and constraints for these columns.\n */\n\nimport type { FieldDefinition } from './scanner/types.js';\n\nexport const SMRT_SYSTEM_FIELDS: Readonly<Record<string, FieldDefinition>> =\n Object.freeze({\n id: Object.freeze({\n type: 'text',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n slug: Object.freeze({\n type: 'text',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n context: Object.freeze({\n type: 'text',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n created_at: Object.freeze({\n type: 'datetime',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n updated_at: Object.freeze({\n type: 'datetime',\n _meta: Object.freeze({ __smrtSystemField: true }),\n }),\n });\n\nexport function isInjectedSmrtSystemField(field: unknown): boolean {\n const meta = (field as { _meta?: { __smrtSystemField?: unknown } } | null)\n ?._meta;\n return Boolean(meta?.__smrtSystemField);\n}\n\nexport function cloneSmrtSystemFields(): Record<string, FieldDefinition> {\n const fields: Record<string, FieldDefinition> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(SMRT_SYSTEM_FIELDS)) {\n fields[fieldName] = {\n ...fieldDef,\n _meta: { ...(fieldDef._meta || {}) },\n };\n }\n\n return fields;\n}\n\nexport function prependSmrtSystemFields<T extends FieldDefinition>(\n fields: Map<string, T>,\n): Map<string, T> {\n const merged = new Map<string, T>();\n\n // The cloned system fields are plain `FieldDefinition`s. `T` is a\n // `FieldDefinition` superset that only adds optional members (e.g. the\n // registry's `RegisteredField`), so a freshly-cloned system field is a\n // structurally-valid `T` at runtime; the downcast records that. Keeping the\n // signature generic preserves the caller's richer element type instead of\n // widening every returned field back to the base `FieldDefinition`.\n for (const [fieldName, fieldDef] of Object.entries(cloneSmrtSystemFields())) {\n merged.set(fieldName, fieldDef as T);\n }\n\n for (const [fieldName, fieldDef] of fields.entries()) {\n if (isInjectedSmrtSystemField(fieldDef) && merged.has(fieldName)) {\n continue;\n }\n merged.set(fieldName, fieldDef);\n }\n\n return merged;\n}\n"],"names":[],"mappings":"AAWO,MAAM,qBACX,OAAO,OAAO;AAAA,EACZ,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,EAAE,mBAAmB,MAAM;AAAA,EAAA,CACjD;AAAA,EACD,MAAM,OAAO,OAAO;AAAA,IAClB,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,EAAE,mBAAmB,MAAM;AAAA,EAAA,CACjD;AAAA,EACD,SAAS,OAAO,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,EAAE,mBAAmB,MAAM;AAAA,EAAA,CACjD;AAAA,EACD,YAAY,OAAO,OAAO;AAAA,IACxB,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,EAAE,mBAAmB,MAAM;AAAA,EAAA,CACjD;AAAA,EACD,YAAY,OAAO,OAAO;AAAA,IACxB,MAAM;AAAA,IACN,OAAO,OAAO,OAAO,EAAE,mBAAmB,MAAM;AAAA,EAAA,CACjD;AACH,CAAC;AAEI,SAAS,0BAA0B,OAAyB;AACjE,QAAM,OAAQ,OACV;AACJ,SAAO,QAAQ,MAAM,iBAAiB;AACxC;AAEO,SAAS,wBAAyD;AACvE,QAAM,SAA0C,CAAA;AAEhD,aAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACtE,WAAO,SAAS,IAAI;AAAA,MAClB,GAAG;AAAA,MACH,OAAO,EAAE,GAAI,SAAS,SAAS,CAAA,EAAC;AAAA,IAAG;AAAA,EAEvC;AAEA,SAAO;AACT;AAEO,SAAS,wBACd,QACgB;AAChB,QAAM,6BAAa,IAAA;AAQnB,aAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,sBAAA,CAAuB,GAAG;AAC3E,WAAO,IAAI,WAAW,QAAa;AAAA,EACrC;AAEA,aAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,WAAW;AACpD,QAAI,0BAA0B,QAAQ,KAAK,OAAO,IAAI,SAAS,GAAG;AAChE;AAAA,IACF;AACA,WAAO,IAAI,WAAW,QAAQ;AAAA,EAChC;AAEA,SAAO;AACT;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
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.
|
|
157
|
-
"@happyvertical/smrt-types": "0.
|
|
158
|
-
"@happyvertical/smrt-scanner": "0.
|
|
156
|
+
"@happyvertical/smrt-config": "0.37.0",
|
|
157
|
+
"@happyvertical/smrt-types": "0.37.0",
|
|
158
|
+
"@happyvertical/smrt-scanner": "0.37.0"
|
|
159
159
|
},
|
|
160
160
|
"peerDependencies": {
|
|
161
161
|
"@huggingface/transformers": ">=3.0.0 <4.0.0",
|