@nitrostack/core 1.0.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/LICENSE +201 -0
- package/README.md +80 -0
- package/dist/auth/api-key.d.ts +118 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +168 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/client.d.ts +151 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +330 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +31 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +46 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +95 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +260 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/pkce.d.ts +53 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +105 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/quick-setup.d.ts +94 -0
- package/dist/auth/quick-setup.d.ts.map +1 -0
- package/dist/auth/quick-setup.js +210 -0
- package/dist/auth/quick-setup.js.map +1 -0
- package/dist/auth/secure-secret.d.ts +136 -0
- package/dist/auth/secure-secret.d.ts.map +1 -0
- package/dist/auth/secure-secret.js +182 -0
- package/dist/auth/secure-secret.js.map +1 -0
- package/dist/auth/server-integration.d.ts +97 -0
- package/dist/auth/server-integration.d.ts.map +1 -0
- package/dist/auth/server-integration.js +182 -0
- package/dist/auth/server-integration.js.map +1 -0
- package/dist/auth/server-metadata.d.ts +51 -0
- package/dist/auth/server-metadata.d.ts.map +1 -0
- package/dist/auth/server-metadata.js +106 -0
- package/dist/auth/server-metadata.js.map +1 -0
- package/dist/auth/simple-jwt.d.ts +174 -0
- package/dist/auth/simple-jwt.d.ts.map +1 -0
- package/dist/auth/simple-jwt.js +162 -0
- package/dist/auth/simple-jwt.js.map +1 -0
- package/dist/auth/token-store.d.ts +104 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +205 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/token-validation.d.ts +59 -0
- package/dist/auth/token-validation.d.ts.map +1 -0
- package/dist/auth/token-validation.js +241 -0
- package/dist/auth/token-validation.js.map +1 -0
- package/dist/auth/types.d.ts +215 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/core/apikey-module.d.ts +69 -0
- package/dist/core/apikey-module.d.ts.map +1 -0
- package/dist/core/apikey-module.js +114 -0
- package/dist/core/apikey-module.js.map +1 -0
- package/dist/core/app-decorator.d.ts +59 -0
- package/dist/core/app-decorator.d.ts.map +1 -0
- package/dist/core/app-decorator.js +322 -0
- package/dist/core/app-decorator.js.map +1 -0
- package/dist/core/builders.d.ts +50 -0
- package/dist/core/builders.d.ts.map +1 -0
- package/dist/core/builders.js +139 -0
- package/dist/core/builders.js.map +1 -0
- package/dist/core/component.d.ts +111 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +228 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/config-module.d.ts +62 -0
- package/dist/core/config-module.d.ts.map +1 -0
- package/dist/core/config-module.js +94 -0
- package/dist/core/config-module.js.map +1 -0
- package/dist/core/decorators/cache.decorator.d.ts +61 -0
- package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
- package/dist/core/decorators/cache.decorator.js +115 -0
- package/dist/core/decorators/cache.decorator.js.map +1 -0
- package/dist/core/decorators/health-check.decorator.d.ts +80 -0
- package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
- package/dist/core/decorators/health-check.decorator.js +153 -0
- package/dist/core/decorators/health-check.decorator.js.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts +63 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.js +129 -0
- package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
- package/dist/core/decorators.d.ts +190 -0
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +170 -0
- package/dist/core/decorators.js.map +1 -0
- package/dist/core/di/container.d.ts +64 -0
- package/dist/core/di/container.d.ts.map +1 -0
- package/dist/core/di/container.js +105 -0
- package/dist/core/di/container.js.map +1 -0
- package/dist/core/di/injectable.decorator.d.ts +62 -0
- package/dist/core/di/injectable.decorator.d.ts.map +1 -0
- package/dist/core/di/injectable.decorator.js +66 -0
- package/dist/core/di/injectable.decorator.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +87 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events/event-emitter.d.ts +50 -0
- package/dist/core/events/event-emitter.d.ts.map +1 -0
- package/dist/core/events/event-emitter.js +94 -0
- package/dist/core/events/event-emitter.js.map +1 -0
- package/dist/core/events/event.decorator.d.ts +48 -0
- package/dist/core/events/event.decorator.d.ts.map +1 -0
- package/dist/core/events/event.decorator.js +72 -0
- package/dist/core/events/event.decorator.js.map +1 -0
- package/dist/core/events/log-emitter.d.ts +14 -0
- package/dist/core/events/log-emitter.d.ts.map +1 -0
- package/dist/core/events/log-emitter.js +20 -0
- package/dist/core/events/log-emitter.js.map +1 -0
- package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
- package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.decorator.js +54 -0
- package/dist/core/filters/exception-filter.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.interface.d.ts +39 -0
- package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.interface.js +2 -0
- package/dist/core/filters/exception-filter.interface.js.map +1 -0
- package/dist/core/guards/apikey.guard.d.ts +22 -0
- package/dist/core/guards/apikey.guard.d.ts.map +1 -0
- package/dist/core/guards/apikey.guard.js +11 -0
- package/dist/core/guards/apikey.guard.js.map +1 -0
- package/dist/core/guards/guard.interface.d.ts +18 -0
- package/dist/core/guards/guard.interface.d.ts.map +1 -0
- package/dist/core/guards/guard.interface.js +2 -0
- package/dist/core/guards/guard.interface.js.map +1 -0
- package/dist/core/guards/jwt.guard.d.ts +18 -0
- package/dist/core/guards/jwt.guard.d.ts.map +1 -0
- package/dist/core/guards/jwt.guard.js +2 -0
- package/dist/core/guards/jwt.guard.js.map +1 -0
- package/dist/core/guards/oauth.guard.d.ts +35 -0
- package/dist/core/guards/oauth.guard.d.ts.map +1 -0
- package/dist/core/guards/oauth.guard.js +2 -0
- package/dist/core/guards/oauth.guard.js.map +1 -0
- package/dist/core/guards/use-guards.decorator.d.ts +25 -0
- package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
- package/dist/core/guards/use-guards.decorator.js +32 -0
- package/dist/core/guards/use-guards.decorator.js.map +1 -0
- package/dist/core/health/health-checks.resource.d.ts +14 -0
- package/dist/core/health/health-checks.resource.d.ts.map +1 -0
- package/dist/core/health/health-checks.resource.js +29 -0
- package/dist/core/health/health-checks.resource.js.map +1 -0
- package/dist/core/index.d.ts +57 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +59 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.js +51 -0
- package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
- package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
- package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.interface.js +2 -0
- package/dist/core/interceptors/interceptor.interface.js.map +1 -0
- package/dist/core/jwt-module.d.ts +51 -0
- package/dist/core/jwt-module.d.ts.map +1 -0
- package/dist/core/jwt-module.js +52 -0
- package/dist/core/jwt-module.js.map +1 -0
- package/dist/core/logger.d.ts +18 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +53 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware/middleware.decorator.d.ts +39 -0
- package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
- package/dist/core/middleware/middleware.decorator.js +53 -0
- package/dist/core/middleware/middleware.decorator.js.map +1 -0
- package/dist/core/middleware/middleware.interface.d.ts +29 -0
- package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
- package/dist/core/middleware/middleware.interface.js +2 -0
- package/dist/core/middleware/middleware.interface.js.map +1 -0
- package/dist/core/module.d.ts +93 -0
- package/dist/core/module.d.ts.map +1 -0
- package/dist/core/module.js +87 -0
- package/dist/core/module.js.map +1 -0
- package/dist/core/oauth-module.d.ts +123 -0
- package/dist/core/oauth-module.d.ts.map +1 -0
- package/dist/core/oauth-module.js +324 -0
- package/dist/core/oauth-module.js.map +1 -0
- package/dist/core/pipes/pipe.decorator.d.ts +64 -0
- package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
- package/dist/core/pipes/pipe.decorator.js +85 -0
- package/dist/core/pipes/pipe.decorator.js.map +1 -0
- package/dist/core/pipes/pipe.interface.d.ts +41 -0
- package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
- package/dist/core/pipes/pipe.interface.js +2 -0
- package/dist/core/pipes/pipe.interface.js.map +1 -0
- package/dist/core/prompt.d.ts +46 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +76 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/resource.d.ts +47 -0
- package/dist/core/resource.d.ts.map +1 -0
- package/dist/core/resource.js +90 -0
- package/dist/core/resource.js.map +1 -0
- package/dist/core/server.d.ts +129 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +617 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/tool.d.ts +108 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +241 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/transports/discovery-http-server.d.ts +19 -0
- package/dist/core/transports/discovery-http-server.d.ts.map +1 -0
- package/dist/core/transports/discovery-http-server.js +54 -0
- package/dist/core/transports/discovery-http-server.js.map +1 -0
- package/dist/core/transports/http-server.d.ts +108 -0
- package/dist/core/transports/http-server.d.ts.map +1 -0
- package/dist/core/transports/http-server.js +293 -0
- package/dist/core/transports/http-server.js.map +1 -0
- package/dist/core/transports/streamable-http.d.ts +177 -0
- package/dist/core/transports/streamable-http.d.ts.map +1 -0
- package/dist/core/transports/streamable-http.js +1287 -0
- package/dist/core/transports/streamable-http.js.map +1 -0
- package/dist/core/types.d.ts +195 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
- package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
- package/dist/core/widgets/widget-examples.resource.js +28 -0
- package/dist/core/widgets/widget-examples.resource.js.map +1 -0
- package/dist/core/widgets/widget-registry.d.ts +56 -0
- package/dist/core/widgets/widget-registry.d.ts.map +1 -0
- package/dist/core/widgets/widget-registry.js +75 -0
- package/dist/core/widgets/widget-registry.js.map +1 -0
- package/dist/testing/index.d.ts +103 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +161 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/ui-next/index.d.ts +31 -0
- package/dist/ui-next/index.d.ts.map +1 -0
- package/dist/ui-next/index.js +687 -0
- package/dist/ui-next/index.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectable.decorator.js","sourceRoot":"","sources":["../../../src/core/di/injectable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAG7D,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AAwBnC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CAAC,OAA2B;IACpD,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAErD,0DAA0D;QAC1D,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAA0B,CAAC,EAAE,CAAC;YAC/C,SAAS,CAAC,QAAQ,CAAC,MAA0B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,KAAqB;IAC1C,OAAO,CAAC,MAAc,EAAE,WAAwC,EAAE,cAAsB,EAAE,EAAE;QAC1F,MAAM,cAAc,GAAqB,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACvF,cAAc,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;QACvC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,OAAO,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for MCP server errors
|
|
3
|
+
*/
|
|
4
|
+
export declare class McpError extends Error {
|
|
5
|
+
code: string;
|
|
6
|
+
statusCode: number;
|
|
7
|
+
details?: unknown | undefined;
|
|
8
|
+
constructor(message: string, code: string, statusCode?: number, details?: unknown | undefined);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Validation error
|
|
12
|
+
*/
|
|
13
|
+
export declare class ValidationError extends McpError {
|
|
14
|
+
constructor(message: string, details?: unknown);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Tool not found error
|
|
18
|
+
*/
|
|
19
|
+
export declare class ToolNotFoundError extends McpError {
|
|
20
|
+
constructor(toolName: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resource not found error
|
|
24
|
+
*/
|
|
25
|
+
export declare class ResourceNotFoundError extends McpError {
|
|
26
|
+
constructor(uri: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Prompt not found error
|
|
30
|
+
*/
|
|
31
|
+
export declare class PromptNotFoundError extends McpError {
|
|
32
|
+
constructor(promptName: string);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Rate limit error
|
|
36
|
+
*/
|
|
37
|
+
export declare class RateLimitError extends McpError {
|
|
38
|
+
constructor(message?: string);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Tool execution error
|
|
42
|
+
*/
|
|
43
|
+
export declare class ToolExecutionError extends McpError {
|
|
44
|
+
constructor(toolName: string, originalError: Error);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Format error for response
|
|
48
|
+
*/
|
|
49
|
+
export declare function formatError(error: Error): {
|
|
50
|
+
code: string;
|
|
51
|
+
message: string;
|
|
52
|
+
details?: unknown;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAGxB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC,EAAE,OAAO;gBAHxB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,OAAO,YAAA;CAM3B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,QAAQ,EAAE,MAAM;CAI7B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,QAAQ;gBACrC,GAAG,EAAE,MAAM;CAIxB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,UAAU,EAAE,MAAM;CAI/B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,OAAO,GAAE,MAA8B;CAIpD;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK;CASnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAaA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for MCP server errors
|
|
3
|
+
*/
|
|
4
|
+
export class McpError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
statusCode;
|
|
7
|
+
details;
|
|
8
|
+
constructor(message, code, statusCode = 500, details) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.statusCode = statusCode;
|
|
12
|
+
this.details = details;
|
|
13
|
+
this.name = 'McpError';
|
|
14
|
+
Error.captureStackTrace(this, this.constructor);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validation error
|
|
19
|
+
*/
|
|
20
|
+
export class ValidationError extends McpError {
|
|
21
|
+
constructor(message, details) {
|
|
22
|
+
super(message, 'VALIDATION_ERROR', 400, details);
|
|
23
|
+
this.name = 'ValidationError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Tool not found error
|
|
28
|
+
*/
|
|
29
|
+
export class ToolNotFoundError extends McpError {
|
|
30
|
+
constructor(toolName) {
|
|
31
|
+
super(`Tool '${toolName}' not found`, 'TOOL_NOT_FOUND', 404);
|
|
32
|
+
this.name = 'ToolNotFoundError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resource not found error
|
|
37
|
+
*/
|
|
38
|
+
export class ResourceNotFoundError extends McpError {
|
|
39
|
+
constructor(uri) {
|
|
40
|
+
super(`Resource '${uri}' not found`, 'RESOURCE_NOT_FOUND', 404);
|
|
41
|
+
this.name = 'ResourceNotFoundError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Prompt not found error
|
|
46
|
+
*/
|
|
47
|
+
export class PromptNotFoundError extends McpError {
|
|
48
|
+
constructor(promptName) {
|
|
49
|
+
super(`Prompt '${promptName}' not found`, 'PROMPT_NOT_FOUND', 404);
|
|
50
|
+
this.name = 'PromptNotFoundError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Rate limit error
|
|
55
|
+
*/
|
|
56
|
+
export class RateLimitError extends McpError {
|
|
57
|
+
constructor(message = 'Rate limit exceeded') {
|
|
58
|
+
super(message, 'RATE_LIMIT_EXCEEDED', 429);
|
|
59
|
+
this.name = 'RateLimitError';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Tool execution error
|
|
64
|
+
*/
|
|
65
|
+
export class ToolExecutionError extends McpError {
|
|
66
|
+
constructor(toolName, originalError) {
|
|
67
|
+
super(`Error executing tool '${toolName}': ${originalError.message}`, 'TOOL_EXECUTION_ERROR', 500, { originalError: originalError.message, stack: originalError.stack });
|
|
68
|
+
this.name = 'ToolExecutionError';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Format error for response
|
|
73
|
+
*/
|
|
74
|
+
export function formatError(error) {
|
|
75
|
+
if (error instanceof McpError) {
|
|
76
|
+
return {
|
|
77
|
+
code: error.code,
|
|
78
|
+
message: error.message,
|
|
79
|
+
details: error.details,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
code: 'INTERNAL_ERROR',
|
|
84
|
+
message: error.message,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGxB;IACA;IACA;IAJT,YACE,OAAe,EACR,IAAY,EACZ,aAAqB,GAAG,EACxB,OAAiB;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAc;QACxB,YAAO,GAAP,OAAO,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,QAAgB;QAC1B,KAAK,CAAC,SAAS,QAAQ,aAAa,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,QAAQ;IACjD,YAAY,GAAW;QACrB,KAAK,CAAC,aAAa,GAAG,aAAa,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,UAAkB;QAC5B,KAAK,CAAC,WAAW,UAAU,aAAa,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,UAAkB,qBAAqB;QACjD,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,QAAgB,EAAE,aAAoB;QAChD,KAAK,CACH,yBAAyB,QAAQ,MAAM,aAAa,CAAC,OAAO,EAAE,EAC9D,sBAAsB,EACtB,GAAG,EACH,EAAE,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,CACrE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY;IAKtC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* Event handler type
|
|
4
|
+
*/
|
|
5
|
+
type EventHandler = (...args: unknown[]) => void | Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Event Emitter
|
|
8
|
+
*
|
|
9
|
+
* Simple event bus for decoupled communication between modules
|
|
10
|
+
*/
|
|
11
|
+
export declare class EventEmitter {
|
|
12
|
+
private static instance;
|
|
13
|
+
private listeners;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(): EventEmitter;
|
|
16
|
+
/**
|
|
17
|
+
* Register an event listener
|
|
18
|
+
*/
|
|
19
|
+
on(event: string, handler: EventHandler): void;
|
|
20
|
+
/**
|
|
21
|
+
* Register a one-time event listener
|
|
22
|
+
*/
|
|
23
|
+
once(event: string, handler: EventHandler): void;
|
|
24
|
+
/**
|
|
25
|
+
* Remove an event listener
|
|
26
|
+
*/
|
|
27
|
+
off(event: string, handler: EventHandler): void;
|
|
28
|
+
/**
|
|
29
|
+
* Emit an event
|
|
30
|
+
*/
|
|
31
|
+
emit(event: string, ...args: unknown[]): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Emit an event synchronously
|
|
34
|
+
*/
|
|
35
|
+
emitSync(event: string, ...args: unknown[]): void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove all listeners for an event
|
|
38
|
+
*/
|
|
39
|
+
removeAllListeners(event?: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get listener count for an event
|
|
42
|
+
*/
|
|
43
|
+
listenerCount(event: string): number;
|
|
44
|
+
/**
|
|
45
|
+
* Get all event names
|
|
46
|
+
*/
|
|
47
|
+
eventNames(): string[];
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../../src/core/events/event-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjE;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,SAAS,CAA0C;IAE3D,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAO9C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAQhD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAc/C;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAOjD;;OAEG;IACH,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;CAGvB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* Event Emitter
|
|
4
|
+
*
|
|
5
|
+
* Simple event bus for decoupled communication between modules
|
|
6
|
+
*/
|
|
7
|
+
export class EventEmitter {
|
|
8
|
+
static instance;
|
|
9
|
+
listeners = new Map();
|
|
10
|
+
constructor() { }
|
|
11
|
+
static getInstance() {
|
|
12
|
+
if (!EventEmitter.instance) {
|
|
13
|
+
EventEmitter.instance = new EventEmitter();
|
|
14
|
+
}
|
|
15
|
+
return EventEmitter.instance;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Register an event listener
|
|
19
|
+
*/
|
|
20
|
+
on(event, handler) {
|
|
21
|
+
if (!this.listeners.has(event)) {
|
|
22
|
+
this.listeners.set(event, []);
|
|
23
|
+
}
|
|
24
|
+
this.listeners.get(event).push(handler);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Register a one-time event listener
|
|
28
|
+
*/
|
|
29
|
+
once(event, handler) {
|
|
30
|
+
const wrappedHandler = async (...args) => {
|
|
31
|
+
await handler(...args);
|
|
32
|
+
this.off(event, wrappedHandler);
|
|
33
|
+
};
|
|
34
|
+
this.on(event, wrappedHandler);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove an event listener
|
|
38
|
+
*/
|
|
39
|
+
off(event, handler) {
|
|
40
|
+
const handlers = this.listeners.get(event);
|
|
41
|
+
if (!handlers)
|
|
42
|
+
return;
|
|
43
|
+
const index = handlers.indexOf(handler);
|
|
44
|
+
if (index > -1) {
|
|
45
|
+
handlers.splice(index, 1);
|
|
46
|
+
}
|
|
47
|
+
if (handlers.length === 0) {
|
|
48
|
+
this.listeners.delete(event);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Emit an event
|
|
53
|
+
*/
|
|
54
|
+
async emit(event, ...args) {
|
|
55
|
+
const handlers = this.listeners.get(event);
|
|
56
|
+
if (!handlers || handlers.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
// Execute all handlers in parallel
|
|
59
|
+
await Promise.all(handlers.map(handler => handler(...args)));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Emit an event synchronously
|
|
63
|
+
*/
|
|
64
|
+
emitSync(event, ...args) {
|
|
65
|
+
const handlers = this.listeners.get(event);
|
|
66
|
+
if (!handlers || handlers.length === 0)
|
|
67
|
+
return;
|
|
68
|
+
handlers.forEach(handler => handler(...args));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Remove all listeners for an event
|
|
72
|
+
*/
|
|
73
|
+
removeAllListeners(event) {
|
|
74
|
+
if (event) {
|
|
75
|
+
this.listeners.delete(event);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.listeners.clear();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get listener count for an event
|
|
83
|
+
*/
|
|
84
|
+
listenerCount(event) {
|
|
85
|
+
return this.listeners.get(event)?.length || 0;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get all event names
|
|
89
|
+
*/
|
|
90
|
+
eventNames() {
|
|
91
|
+
return Array.from(this.listeners.keys());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=event-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../../src/core/events/event-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* Event handler metadata
|
|
4
|
+
*/
|
|
5
|
+
interface EventHandlerMetadata {
|
|
6
|
+
event: string;
|
|
7
|
+
methodName: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Marks a method as an event handler
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* export class OrderTools {
|
|
15
|
+
* @Tool({ name: 'create_order', ... })
|
|
16
|
+
* async createOrder(input: Record<string, unknown>, ctx: ExecutionContext) {
|
|
17
|
+
* const order = await this.saveOrder(input);
|
|
18
|
+
*
|
|
19
|
+
* // Emit event
|
|
20
|
+
* ctx.emit('order.created', order);
|
|
21
|
+
*
|
|
22
|
+
* return order;
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* export class NotificationService {
|
|
27
|
+
* @OnEvent('order.created')
|
|
28
|
+
* async handleOrderCreated(order: unknown) {
|
|
29
|
+
* await this.sendConfirmationEmail(order);
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function OnEvent(event: string): MethodDecorator;
|
|
35
|
+
/**
|
|
36
|
+
* Get event handlers from a class
|
|
37
|
+
*/
|
|
38
|
+
export declare function getEventHandlers(target: object): EventHandlerMetadata[];
|
|
39
|
+
/**
|
|
40
|
+
* Register all event handlers from a class instance
|
|
41
|
+
*/
|
|
42
|
+
export declare function registerEventHandlers(instance: object & Record<string, unknown>): void;
|
|
43
|
+
/**
|
|
44
|
+
* Emit an event from execution context
|
|
45
|
+
*/
|
|
46
|
+
export declare function emitEvent(event: string, ...args: unknown[]): void;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=event.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.decorator.d.ts","sourceRoot":"","sources":["../../../src/core/events/event.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAK1B;;GAEG;AACH,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAUtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWtF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CASjE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { EventEmitter } from './event-emitter.js';
|
|
3
|
+
const EVENT_HANDLER_KEY = 'nitrostack:event_handler';
|
|
4
|
+
/**
|
|
5
|
+
* Marks a method as an event handler
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* export class OrderTools {
|
|
10
|
+
* @Tool({ name: 'create_order', ... })
|
|
11
|
+
* async createOrder(input: Record<string, unknown>, ctx: ExecutionContext) {
|
|
12
|
+
* const order = await this.saveOrder(input);
|
|
13
|
+
*
|
|
14
|
+
* // Emit event
|
|
15
|
+
* ctx.emit('order.created', order);
|
|
16
|
+
*
|
|
17
|
+
* return order;
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* export class NotificationService {
|
|
22
|
+
* @OnEvent('order.created')
|
|
23
|
+
* async handleOrderCreated(order: unknown) {
|
|
24
|
+
* await this.sendConfirmationEmail(order);
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function OnEvent(event) {
|
|
30
|
+
return (target, propertyKey, descriptor) => {
|
|
31
|
+
const targetWithConstructor = target;
|
|
32
|
+
const existingHandlers = Reflect.getMetadata(EVENT_HANDLER_KEY, targetWithConstructor.constructor) || [];
|
|
33
|
+
existingHandlers.push({
|
|
34
|
+
event,
|
|
35
|
+
methodName: propertyKey,
|
|
36
|
+
});
|
|
37
|
+
Reflect.defineMetadata(EVENT_HANDLER_KEY, existingHandlers, targetWithConstructor.constructor);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get event handlers from a class
|
|
42
|
+
*/
|
|
43
|
+
export function getEventHandlers(target) {
|
|
44
|
+
return Reflect.getMetadata(EVENT_HANDLER_KEY, target) || [];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register all event handlers from a class instance
|
|
48
|
+
*/
|
|
49
|
+
export function registerEventHandlers(instance) {
|
|
50
|
+
const emitter = EventEmitter.getInstance();
|
|
51
|
+
const handlers = getEventHandlers(instance.constructor);
|
|
52
|
+
for (const { event, methodName } of handlers) {
|
|
53
|
+
const method = instance[String(methodName)];
|
|
54
|
+
if (typeof method === 'function') {
|
|
55
|
+
const handler = method.bind(instance);
|
|
56
|
+
emitter.on(event, handler);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Emit an event from execution context
|
|
62
|
+
*/
|
|
63
|
+
export function emitEvent(event, ...args) {
|
|
64
|
+
const emitter = EventEmitter.getInstance();
|
|
65
|
+
// Use sync emit to avoid blocking
|
|
66
|
+
emitter.emitSync(event, ...args);
|
|
67
|
+
// Also emit async in background
|
|
68
|
+
emitter.emit(event, ...args).catch(error => {
|
|
69
|
+
console.error(`Error in event handler for ${event}:`, error);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=event.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.decorator.js","sourceRoot":"","sources":["../../../src/core/events/event.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAUrD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,CAAC,MAAc,EAAE,WAA4B,EAAE,UAA8B,EAAE,EAAE;QACtF,MAAM,qBAAqB,GAAG,MAAiC,CAAC;QAChE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACzG,gBAAgB,CAAC,IAAI,CAAC;YACpB,KAAK;YACL,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC;QACH,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjG,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA0C;IAC9E,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAE,QAAoC,CAAC,WAAW,CAAC,CAAC;IAErF,KAAK,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,GAAG,IAAe;IACzD,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC3C,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAEjC,gCAAgC;IAChC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACzC,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import Transport from 'winston-transport';
|
|
3
|
+
export declare const logEmitter: EventEmitter<[never]>;
|
|
4
|
+
interface LogInfo {
|
|
5
|
+
level: string;
|
|
6
|
+
message: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export declare class EventEmitterTransport extends Transport {
|
|
10
|
+
constructor(opts?: Transport.TransportStreamOptions);
|
|
11
|
+
log(info: LogInfo, callback: () => void): void;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=log-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-emitter.d.ts","sourceRoot":"","sources":["../../../src/core/events/log-emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,eAAO,MAAM,UAAU,uBAAqB,CAAC;AAE7C,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,IAAI,CAAC,EAAE,SAAS,CAAC,sBAAsB;IAInD,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI;CAUxC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import Transport from 'winston-transport';
|
|
3
|
+
// Create a new event emitter
|
|
4
|
+
export const logEmitter = new EventEmitter();
|
|
5
|
+
// Define a custom winston transport
|
|
6
|
+
export class EventEmitterTransport extends Transport {
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
super(opts);
|
|
9
|
+
}
|
|
10
|
+
log(info, callback) {
|
|
11
|
+
setImmediate(() => {
|
|
12
|
+
logEmitter.emit('log', info);
|
|
13
|
+
// Also write to stderr for the dev wrapper to capture
|
|
14
|
+
process.stderr.write(`NITRO_LOG::${JSON.stringify(info)}\n`);
|
|
15
|
+
});
|
|
16
|
+
// Perform the callback
|
|
17
|
+
callback();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=log-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-emitter.js","sourceRoot":"","sources":["../../../src/core/events/log-emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;AAQ7C,oCAAoC;AACpC,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAClD,YAAY,IAAuC;QACjD,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAa,EAAE,QAAoB;QACrC,YAAY,CAAC,GAAG,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7B,sDAAsD;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,QAAQ,EAAE,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { ExceptionFilterConstructor } from './exception-filter.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* Marks a class as an exception filter
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* @ExceptionFilter()
|
|
9
|
+
* export class GlobalExceptionFilter implements ExceptionFilterInterface {
|
|
10
|
+
* catch(exception: unknown, context: ExecutionContext) {
|
|
11
|
+
* context.logger.error('Exception caught:', exception);
|
|
12
|
+
* return {
|
|
13
|
+
* error: exception instanceof Error ? exception.message : String(exception),
|
|
14
|
+
* timestamp: new Date().toISOString(),
|
|
15
|
+
* };
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function ExceptionFilter(): ClassDecorator;
|
|
21
|
+
/**
|
|
22
|
+
* Apply exception filters to a tool method
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* @Tool({ name: 'create_user', ... })
|
|
27
|
+
* @UseFilters(ValidationExceptionFilter, HttpExceptionFilter)
|
|
28
|
+
* async createUser(input: Record<string, unknown>) { }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function UseFilters(...filters: ExceptionFilterConstructor[]): MethodDecorator;
|
|
32
|
+
/**
|
|
33
|
+
* Get exception filters for a method
|
|
34
|
+
*/
|
|
35
|
+
export declare function getExceptionFilterMetadata(target: object, propertyKey: string | symbol): ExceptionFilterConstructor[];
|
|
36
|
+
/**
|
|
37
|
+
* Check if a class is marked as an exception filter
|
|
38
|
+
*/
|
|
39
|
+
export declare function isExceptionFilter(target: object): boolean;
|
|
40
|
+
//# sourceMappingURL=exception-filter.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-filter.decorator.d.ts","sourceRoot":"","sources":["../../../src/core/filters/exception-filter.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAK7E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,IAAI,cAAc,CAIhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,OAAO,EAAE,0BAA0B,EAAE,GAAG,eAAe,CAUpF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,0BAA0B,EAAE,CAErH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
const EXCEPTION_FILTER_KEY = 'nitrostack:exception_filter';
|
|
3
|
+
const IS_EXCEPTION_FILTER_KEY = 'nitrostack:is_exception_filter';
|
|
4
|
+
/**
|
|
5
|
+
* Marks a class as an exception filter
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* @ExceptionFilter()
|
|
10
|
+
* export class GlobalExceptionFilter implements ExceptionFilterInterface {
|
|
11
|
+
* catch(exception: unknown, context: ExecutionContext) {
|
|
12
|
+
* context.logger.error('Exception caught:', exception);
|
|
13
|
+
* return {
|
|
14
|
+
* error: exception instanceof Error ? exception.message : String(exception),
|
|
15
|
+
* timestamp: new Date().toISOString(),
|
|
16
|
+
* };
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function ExceptionFilter() {
|
|
22
|
+
return (target) => {
|
|
23
|
+
Reflect.defineMetadata(IS_EXCEPTION_FILTER_KEY, true, target);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Apply exception filters to a tool method
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* @Tool({ name: 'create_user', ... })
|
|
32
|
+
* @UseFilters(ValidationExceptionFilter, HttpExceptionFilter)
|
|
33
|
+
* async createUser(input: Record<string, unknown>) { }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function UseFilters(...filters) {
|
|
37
|
+
return (target, propertyKey, descriptor) => {
|
|
38
|
+
const existingFilters = Reflect.getMetadata(EXCEPTION_FILTER_KEY, target, propertyKey) || [];
|
|
39
|
+
Reflect.defineMetadata(EXCEPTION_FILTER_KEY, [...existingFilters, ...filters], target, propertyKey);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get exception filters for a method
|
|
44
|
+
*/
|
|
45
|
+
export function getExceptionFilterMetadata(target, propertyKey) {
|
|
46
|
+
return Reflect.getMetadata(EXCEPTION_FILTER_KEY, target, propertyKey) || [];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a class is marked as an exception filter
|
|
50
|
+
*/
|
|
51
|
+
export function isExceptionFilter(target) {
|
|
52
|
+
return Reflect.getMetadata(IS_EXCEPTION_FILTER_KEY, target) === true;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=exception-filter.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-filter.decorator.js","sourceRoot":"","sources":["../../../src/core/filters/exception-filter.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAC3D,MAAM,uBAAuB,GAAG,gCAAgC,CAAC;AAEjE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,OAAO,CAAC,cAAc,CAAC,uBAAuB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,GAAG,OAAqC;IACjE,OAAO,CAAC,MAAc,EAAE,WAA4B,EAAE,UAA8B,EAAE,EAAE;QACtF,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7F,OAAO,CAAC,cAAc,CACpB,oBAAoB,EACpB,CAAC,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC,EAChC,MAAM,EACN,WAAW,CACZ,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,WAA4B;IACrF,OAAO,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,OAAO,CAAC,WAAW,CAAC,uBAAuB,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { ExecutionContext } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Exception with optional status code
|
|
5
|
+
*/
|
|
6
|
+
export interface ExceptionWithStatus extends Error {
|
|
7
|
+
status?: number;
|
|
8
|
+
statusCode?: number;
|
|
9
|
+
code?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Exception Filter Interface
|
|
13
|
+
*
|
|
14
|
+
* Exception filters handle errors thrown during tool execution.
|
|
15
|
+
* They can transform errors into user-friendly responses.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* @ExceptionFilter()
|
|
20
|
+
* export class HttpExceptionFilter implements ExceptionFilterInterface {
|
|
21
|
+
* catch(exception: unknown, context: ExecutionContext) {
|
|
22
|
+
* const err = exception as ExceptionWithStatus;
|
|
23
|
+
* return {
|
|
24
|
+
* statusCode: err.status || 500,
|
|
25
|
+
* message: err.message,
|
|
26
|
+
* timestamp: new Date().toISOString(),
|
|
27
|
+
* };
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export interface ExceptionFilterInterface {
|
|
33
|
+
catch(exception: unknown, context: ExecutionContext): unknown | Promise<unknown>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Exception filter constructor type
|
|
37
|
+
*/
|
|
38
|
+
export type ExceptionFilterConstructor = new (...args: unknown[]) => ExceptionFilterInterface;
|
|
39
|
+
//# sourceMappingURL=exception-filter.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-filter.interface.d.ts","sourceRoot":"","sources":["../../../src/core/filters/exception-filter.interface.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,KAAK;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClF;AAED;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-filter.interface.js","sourceRoot":"","sources":["../../../src/core/filters/exception-filter.interface.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Guard Interface
|
|
3
|
+
*
|
|
4
|
+
* This is exported from the SDK for type definitions.
|
|
5
|
+
* The actual ApiKeyGuard implementation should be in your project's guards folder.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* See templates/typescript-auth-api-key/src/guards/apikey.guard.ts for implementation
|
|
9
|
+
*/
|
|
10
|
+
export interface ApiKeyMetadata {
|
|
11
|
+
/** The API key value (raw) */
|
|
12
|
+
key: string;
|
|
13
|
+
/** Optional: API key name/identifier */
|
|
14
|
+
name?: string;
|
|
15
|
+
/** Optional: Key prefix (e.g., 'sk' for secret key, 'pk' for public key) */
|
|
16
|
+
prefix?: string;
|
|
17
|
+
/** Optional: Scopes/permissions */
|
|
18
|
+
scopes?: string[];
|
|
19
|
+
/** Optional: Additional metadata */
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=apikey.guard.d.ts.map
|