@dangao/bun-server 1.12.0 → 2.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/README.md +32 -0
- package/dist/ai/ai-module.d.ts +24 -0
- package/dist/ai/ai-module.d.ts.map +1 -0
- package/dist/ai/decorators.d.ts +25 -0
- package/dist/ai/decorators.d.ts.map +1 -0
- package/dist/ai/errors.d.ts +39 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/providers/anthropic-provider.d.ts +23 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/providers/google-provider.d.ts +20 -0
- package/dist/ai/providers/google-provider.d.ts.map +1 -0
- package/dist/ai/providers/ollama-provider.d.ts +17 -0
- package/dist/ai/providers/ollama-provider.d.ts.map +1 -0
- package/dist/ai/providers/openai-provider.d.ts +28 -0
- package/dist/ai/providers/openai-provider.d.ts.map +1 -0
- package/dist/ai/service.d.ts +40 -0
- package/dist/ai/service.d.ts.map +1 -0
- package/dist/ai/tools/tool-executor.d.ts +15 -0
- package/dist/ai/tools/tool-executor.d.ts.map +1 -0
- package/dist/ai/tools/tool-registry.d.ts +39 -0
- package/dist/ai/tools/tool-registry.d.ts.map +1 -0
- package/dist/ai/types.d.ts +134 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai-guard/ai-guard-module.d.ts +18 -0
- package/dist/ai-guard/ai-guard-module.d.ts.map +1 -0
- package/dist/ai-guard/decorators.d.ts +16 -0
- package/dist/ai-guard/decorators.d.ts.map +1 -0
- package/dist/ai-guard/detectors/content-moderator.d.ts +26 -0
- package/dist/ai-guard/detectors/content-moderator.d.ts.map +1 -0
- package/dist/ai-guard/detectors/injection-detector.d.ts +13 -0
- package/dist/ai-guard/detectors/injection-detector.d.ts.map +1 -0
- package/dist/ai-guard/detectors/pii-detector.d.ts +11 -0
- package/dist/ai-guard/detectors/pii-detector.d.ts.map +1 -0
- package/dist/ai-guard/index.d.ts +8 -0
- package/dist/ai-guard/index.d.ts.map +1 -0
- package/dist/ai-guard/service.d.ts +21 -0
- package/dist/ai-guard/service.d.ts.map +1 -0
- package/dist/ai-guard/types.d.ts +59 -0
- package/dist/ai-guard/types.d.ts.map +1 -0
- package/dist/conversation/conversation-module.d.ts +25 -0
- package/dist/conversation/conversation-module.d.ts.map +1 -0
- package/dist/conversation/decorators.d.ts +28 -0
- package/dist/conversation/decorators.d.ts.map +1 -0
- package/dist/conversation/index.d.ts +8 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/service.d.ts +43 -0
- package/dist/conversation/service.d.ts.map +1 -0
- package/dist/conversation/stores/database-store.d.ts +46 -0
- package/dist/conversation/stores/database-store.d.ts.map +1 -0
- package/dist/conversation/stores/memory-store.d.ts +17 -0
- package/dist/conversation/stores/memory-store.d.ts.map +1 -0
- package/dist/conversation/stores/redis-store.d.ts +39 -0
- package/dist/conversation/stores/redis-store.d.ts.map +1 -0
- package/dist/conversation/types.d.ts +64 -0
- package/dist/conversation/types.d.ts.map +1 -0
- package/dist/core/cluster.d.ts +42 -3
- package/dist/core/cluster.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/embedding/embedding-module.d.ts +20 -0
- package/dist/embedding/embedding-module.d.ts.map +1 -0
- package/dist/embedding/index.d.ts +6 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/providers/ollama-embedding-provider.d.ts +18 -0
- package/dist/embedding/providers/ollama-embedding-provider.d.ts.map +1 -0
- package/dist/embedding/providers/openai-embedding-provider.d.ts +18 -0
- package/dist/embedding/providers/openai-embedding-provider.d.ts.map +1 -0
- package/dist/embedding/service.d.ts +27 -0
- package/dist/embedding/service.d.ts.map +1 -0
- package/dist/embedding/types.d.ts +25 -0
- package/dist/embedding/types.d.ts.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2870 -88
- package/dist/mcp/decorators.d.ts +42 -0
- package/dist/mcp/decorators.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/mcp-module.d.ts +22 -0
- package/dist/mcp/mcp-module.d.ts.map +1 -0
- package/dist/mcp/registry.d.ts +23 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/server.d.ts +29 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/types.d.ts +60 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/prompt/index.d.ts +6 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/prompt-module.d.ts +23 -0
- package/dist/prompt/prompt-module.d.ts.map +1 -0
- package/dist/prompt/service.d.ts +47 -0
- package/dist/prompt/service.d.ts.map +1 -0
- package/dist/prompt/stores/file-store.d.ts +36 -0
- package/dist/prompt/stores/file-store.d.ts.map +1 -0
- package/dist/prompt/stores/memory-store.d.ts +17 -0
- package/dist/prompt/stores/memory-store.d.ts.map +1 -0
- package/dist/prompt/types.d.ts +68 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/rag/chunkers/markdown-chunker.d.ts +11 -0
- package/dist/rag/chunkers/markdown-chunker.d.ts.map +1 -0
- package/dist/rag/chunkers/text-chunker.d.ts +11 -0
- package/dist/rag/chunkers/text-chunker.d.ts.map +1 -0
- package/dist/rag/decorators.d.ts +24 -0
- package/dist/rag/decorators.d.ts.map +1 -0
- package/dist/rag/index.d.ts +7 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/rag-module.d.ts +23 -0
- package/dist/rag/rag-module.d.ts.map +1 -0
- package/dist/rag/service.d.ts +36 -0
- package/dist/rag/service.d.ts.map +1 -0
- package/dist/rag/types.d.ts +56 -0
- package/dist/rag/types.d.ts.map +1 -0
- package/dist/vector-store/index.d.ts +6 -0
- package/dist/vector-store/index.d.ts.map +1 -0
- package/dist/vector-store/stores/memory-store.d.ts +17 -0
- package/dist/vector-store/stores/memory-store.d.ts.map +1 -0
- package/dist/vector-store/stores/pinecone-store.d.ts +27 -0
- package/dist/vector-store/stores/pinecone-store.d.ts.map +1 -0
- package/dist/vector-store/stores/qdrant-store.d.ts +29 -0
- package/dist/vector-store/stores/qdrant-store.d.ts.map +1 -0
- package/dist/vector-store/types.d.ts +60 -0
- package/dist/vector-store/types.d.ts.map +1 -0
- package/dist/vector-store/vector-store-module.d.ts +20 -0
- package/dist/vector-store/vector-store-module.d.ts.map +1 -0
- package/docs/ai.md +500 -0
- package/docs/best-practices.md +83 -8
- package/docs/database.md +23 -0
- package/docs/guide.md +90 -27
- package/docs/migration.md +81 -7
- package/docs/security.md +23 -0
- package/docs/zh/ai.md +441 -0
- package/docs/zh/best-practices.md +43 -0
- package/docs/zh/database.md +23 -0
- package/docs/zh/guide.md +40 -1
- package/docs/zh/migration.md +39 -0
- package/docs/zh/security.md +23 -0
- package/package.json +2 -2
- package/src/ai/ai-module.ts +62 -0
- package/src/ai/decorators.ts +30 -0
- package/src/ai/errors.ts +71 -0
- package/src/ai/index.ts +11 -0
- package/src/ai/providers/anthropic-provider.ts +190 -0
- package/src/ai/providers/google-provider.ts +179 -0
- package/src/ai/providers/ollama-provider.ts +126 -0
- package/src/ai/providers/openai-provider.ts +242 -0
- package/src/ai/service.ts +155 -0
- package/src/ai/tools/tool-executor.ts +38 -0
- package/src/ai/tools/tool-registry.ts +91 -0
- package/src/ai/types.ts +145 -0
- package/src/ai-guard/ai-guard-module.ts +50 -0
- package/src/ai-guard/decorators.ts +21 -0
- package/src/ai-guard/detectors/content-moderator.ts +80 -0
- package/src/ai-guard/detectors/injection-detector.ts +48 -0
- package/src/ai-guard/detectors/pii-detector.ts +64 -0
- package/src/ai-guard/index.ts +7 -0
- package/src/ai-guard/service.ts +100 -0
- package/src/ai-guard/types.ts +61 -0
- package/src/conversation/conversation-module.ts +63 -0
- package/src/conversation/decorators.ts +47 -0
- package/src/conversation/index.ts +7 -0
- package/src/conversation/service.ts +133 -0
- package/src/conversation/stores/database-store.ts +125 -0
- package/src/conversation/stores/memory-store.ts +57 -0
- package/src/conversation/stores/redis-store.ts +101 -0
- package/src/conversation/types.ts +68 -0
- package/src/core/cluster.ts +239 -46
- package/src/core/index.ts +1 -1
- package/src/core/server.ts +91 -78
- package/src/embedding/embedding-module.ts +52 -0
- package/src/embedding/index.ts +5 -0
- package/src/embedding/providers/ollama-embedding-provider.ts +39 -0
- package/src/embedding/providers/openai-embedding-provider.ts +47 -0
- package/src/embedding/service.ts +55 -0
- package/src/embedding/types.ts +27 -0
- package/src/index.ts +11 -1
- package/src/mcp/decorators.ts +60 -0
- package/src/mcp/index.ts +5 -0
- package/src/mcp/mcp-module.ts +58 -0
- package/src/mcp/registry.ts +72 -0
- package/src/mcp/server.ts +164 -0
- package/src/mcp/types.ts +63 -0
- package/src/prompt/index.ts +5 -0
- package/src/prompt/prompt-module.ts +61 -0
- package/src/prompt/service.ts +93 -0
- package/src/prompt/stores/file-store.ts +135 -0
- package/src/prompt/stores/memory-store.ts +82 -0
- package/src/prompt/types.ts +84 -0
- package/src/rag/chunkers/markdown-chunker.ts +40 -0
- package/src/rag/chunkers/text-chunker.ts +30 -0
- package/src/rag/decorators.ts +26 -0
- package/src/rag/index.ts +6 -0
- package/src/rag/rag-module.ts +78 -0
- package/src/rag/service.ts +134 -0
- package/src/rag/types.ts +47 -0
- package/src/vector-store/index.ts +5 -0
- package/src/vector-store/stores/memory-store.ts +69 -0
- package/src/vector-store/stores/pinecone-store.ts +123 -0
- package/src/vector-store/stores/qdrant-store.ts +147 -0
- package/src/vector-store/types.ts +77 -0
- package/src/vector-store/vector-store-module.ts +50 -0
- package/tests/ai/ai-module.test.ts +46 -0
- package/tests/ai/ai-service.test.ts +91 -0
- package/tests/ai/tool-registry.test.ts +57 -0
- package/tests/ai-guard/ai-guard-module.test.ts +23 -0
- package/tests/ai-guard/content-moderator.test.ts +65 -0
- package/tests/ai-guard/pii-detector.test.ts +41 -0
- package/tests/conversation/conversation-module.test.ts +26 -0
- package/tests/conversation/conversation-service.test.ts +64 -0
- package/tests/conversation/memory-store.test.ts +68 -0
- package/tests/core/cluster.test.ts +45 -1
- package/tests/embedding/embedding-service.test.ts +55 -0
- package/tests/mcp/mcp-server.test.ts +85 -0
- package/tests/prompt/prompt-module.test.ts +30 -0
- package/tests/prompt/prompt-service.test.ts +74 -0
- package/tests/rag/chunkers.test.ts +58 -0
- package/tests/rag/rag-service.test.ts +66 -0
- package/tests/vector-store/memory-vector-store.test.ts +84 -0
- package/tests/interceptor/perf/interceptor-performance.test.ts +0 -340
- package/tests/perf/optimization.test.ts +0 -182
- package/tests/perf/regression.test.ts +0 -120
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { McpToolDefinition, McpResourceDefinition } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Mark a method as an MCP tool.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* \@McpTool({
|
|
8
|
+
* name: 'get_weather',
|
|
9
|
+
* description: 'Get current weather for a city',
|
|
10
|
+
* inputSchema: {
|
|
11
|
+
* type: 'object',
|
|
12
|
+
* properties: { city: { type: 'string' } },
|
|
13
|
+
* required: ['city'],
|
|
14
|
+
* },
|
|
15
|
+
* })
|
|
16
|
+
* public async getWeather({ city }: { city: string }) {
|
|
17
|
+
* return { temperature: 22, city };
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function McpTool(definition: McpToolDefinition): MethodDecorator;
|
|
22
|
+
/**
|
|
23
|
+
* Mark a method as an MCP resource provider.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* \@McpResource({
|
|
28
|
+
* uri: 'user://{id}',
|
|
29
|
+
* name: 'User Profile',
|
|
30
|
+
* mimeType: 'application/json',
|
|
31
|
+
* })
|
|
32
|
+
* public async getUserResource(\@McpParam('id') id: string) {
|
|
33
|
+
* return this.userService.find(id);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function McpResource(definition: McpResourceDefinition): MethodDecorator;
|
|
38
|
+
/**
|
|
39
|
+
* Extract a named parameter from MCP tool input arguments.
|
|
40
|
+
*/
|
|
41
|
+
export declare function McpParam(name: string): ParameterDecorator;
|
|
42
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/mcp/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGxE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,iBAAiB,GAAG,eAAe,CAItE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,qBAAqB,GAAG,eAAe,CAI9E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAOzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type McpModuleOptions } from './types';
|
|
2
|
+
export declare class McpModule {
|
|
3
|
+
/**
|
|
4
|
+
* Configure the MCP module.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* McpModule.forRoot({
|
|
9
|
+
* transport: 'sse',
|
|
10
|
+
* path: '/mcp',
|
|
11
|
+
* serverInfo: { name: 'my-api', version: '1.0.0' },
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* // Register tools by scanning instances:
|
|
15
|
+
* const registry = container.resolve<McpRegistry>(MCP_SERVER_TOKEN);
|
|
16
|
+
* registry.scan(myServiceInstance);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
static forRoot(options: McpModuleOptions): typeof McpModule;
|
|
20
|
+
static reset(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=mcp-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-module.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErF,qBACa,SAAS;IACpB;;;;;;;;;;;;;;;OAeG;WACW,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,SAAS;WA8BpD,KAAK,IAAI,IAAI;CAG5B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { McpToolDefinition, McpResourceDefinition } from './types';
|
|
2
|
+
export interface RegisteredMcpTool extends McpToolDefinition {
|
|
3
|
+
execute(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
}
|
|
5
|
+
export interface RegisteredMcpResource extends McpResourceDefinition {
|
|
6
|
+
read(uriParams: Record<string, string>): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Registry for MCP tools and resources discovered via decorators.
|
|
10
|
+
*/
|
|
11
|
+
export declare class McpRegistry {
|
|
12
|
+
private readonly tools;
|
|
13
|
+
private readonly resources;
|
|
14
|
+
/**
|
|
15
|
+
* Scan an object instance for @McpTool() and @McpResource() decorated methods
|
|
16
|
+
*/
|
|
17
|
+
scan(instance: object): void;
|
|
18
|
+
getTools(): RegisteredMcpTool[];
|
|
19
|
+
getResources(): RegisteredMcpResource[];
|
|
20
|
+
getTool(name: string): RegisteredMcpTool | undefined;
|
|
21
|
+
getResource(uri: string): RegisteredMcpResource | undefined;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGxE,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IAEtE;;OAEG;IACI,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmC5B,QAAQ,IAAI,iBAAiB,EAAE;IAI/B,YAAY,IAAI,qBAAqB,EAAE;IAIvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIpD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;CAGnE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { McpServerInfo, JsonRpcRequest, JsonRpcResponse } from './types';
|
|
2
|
+
import type { McpRegistry } from './registry';
|
|
3
|
+
/**
|
|
4
|
+
* MCP protocol server — handles JSON-RPC 2.0 requests from MCP clients.
|
|
5
|
+
* Supports SSE transport (HTTP) and stdio transport.
|
|
6
|
+
*
|
|
7
|
+
* Implements MCP specification 2024-11-05.
|
|
8
|
+
*/
|
|
9
|
+
export declare class McpServer {
|
|
10
|
+
private readonly registry;
|
|
11
|
+
private readonly serverInfo;
|
|
12
|
+
constructor(registry: McpRegistry, serverInfo: McpServerInfo);
|
|
13
|
+
/**
|
|
14
|
+
* Handle an incoming JSON-RPC request and return a response
|
|
15
|
+
*/
|
|
16
|
+
handle(request: JsonRpcRequest): Promise<JsonRpcResponse>;
|
|
17
|
+
/**
|
|
18
|
+
* Handle a raw HTTP request body (JSON-RPC over HTTP)
|
|
19
|
+
* Returns a Response suitable for Bun's serve()
|
|
20
|
+
*/
|
|
21
|
+
handleHttp(req: Request): Promise<Response>;
|
|
22
|
+
/**
|
|
23
|
+
* Create an SSE response that keeps the connection open for streaming
|
|
24
|
+
* This is the SSE transport endpoint
|
|
25
|
+
*/
|
|
26
|
+
createSseResponse(): Response;
|
|
27
|
+
private dispatch;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBAExB,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa;IAKnE;;OAEG;IACU,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAgBtE;;;OAGG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAQxD;;;OAGG;IACI,iBAAiB,IAAI,QAAQ;YAmCtB,QAAQ;CAkEvB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool definition
|
|
3
|
+
*/
|
|
4
|
+
export interface McpToolDefinition {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
inputSchema: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* MCP resource definition
|
|
11
|
+
*/
|
|
12
|
+
export interface McpResourceDefinition {
|
|
13
|
+
uri: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
mimeType?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* MCP server info
|
|
20
|
+
*/
|
|
21
|
+
export interface McpServerInfo {
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* MCP transport type
|
|
28
|
+
*/
|
|
29
|
+
export type McpTransport = 'sse' | 'stdio';
|
|
30
|
+
export interface McpModuleOptions {
|
|
31
|
+
transport?: McpTransport;
|
|
32
|
+
/** Path for SSE endpoint (default: '/mcp') */
|
|
33
|
+
path?: string;
|
|
34
|
+
serverInfo: McpServerInfo;
|
|
35
|
+
}
|
|
36
|
+
export declare const MCP_SERVER_TOKEN: unique symbol;
|
|
37
|
+
export declare const MCP_OPTIONS_TOKEN: unique symbol;
|
|
38
|
+
/** Metadata key for @McpTool() */
|
|
39
|
+
export declare const MCP_TOOL_METADATA_KEY = "@dangao/bun-server:mcp:tool";
|
|
40
|
+
/** Metadata key for @McpResource() */
|
|
41
|
+
export declare const MCP_RESOURCE_METADATA_KEY = "@dangao/bun-server:mcp:resource";
|
|
42
|
+
/** JSON-RPC 2.0 Request */
|
|
43
|
+
export interface JsonRpcRequest {
|
|
44
|
+
jsonrpc: '2.0';
|
|
45
|
+
id: string | number | null;
|
|
46
|
+
method: string;
|
|
47
|
+
params?: unknown;
|
|
48
|
+
}
|
|
49
|
+
/** JSON-RPC 2.0 Response */
|
|
50
|
+
export interface JsonRpcResponse {
|
|
51
|
+
jsonrpc: '2.0';
|
|
52
|
+
id: string | number | null;
|
|
53
|
+
result?: unknown;
|
|
54
|
+
error?: {
|
|
55
|
+
code: number;
|
|
56
|
+
message: string;
|
|
57
|
+
data?: unknown;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,eAA0C,CAAC;AACxE,eAAO,MAAM,iBAAiB,eAA2C,CAAC;AAE1E,kCAAkC;AAClC,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AACnE,sCAAsC;AACtC,eAAO,MAAM,yBAAyB,oCAAoC,CAAC;AAE3E,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,4BAA4B;AAC5B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type PromptModuleOptions } from './types';
|
|
2
|
+
export declare class PromptModule {
|
|
3
|
+
/**
|
|
4
|
+
* Configure the prompt module.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // With in-memory store (default):
|
|
9
|
+
* PromptModule.forRoot({});
|
|
10
|
+
*
|
|
11
|
+
* // With file store:
|
|
12
|
+
* PromptModule.forRoot({
|
|
13
|
+
* store: new FilePromptStore({ promptsDir: './.prompts' }),
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
static forRoot(options?: PromptModuleOptions): typeof PromptModule;
|
|
18
|
+
/**
|
|
19
|
+
* Reset module state (for testing)
|
|
20
|
+
*/
|
|
21
|
+
static reset(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=prompt-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-module.d.ts","sourceRoot":"","sources":["../../src/prompt/prompt-module.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,SAAS,CAAC;AAGjB,qBACa,YAAY;IACvB;;;;;;;;;;;;;OAaG;WACW,OAAO,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,YAAY;IA4B7E;;OAEG;WACW,KAAK,IAAI,IAAI;CAG5B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { PromptTemplate, CreatePromptTemplateInput, UpdatePromptTemplateInput, PromptModuleOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Manages prompt templates: CRUD operations, versioning, and variable rendering.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PromptService {
|
|
6
|
+
private readonly store;
|
|
7
|
+
constructor(options: PromptModuleOptions);
|
|
8
|
+
/**
|
|
9
|
+
* Get a template by ID
|
|
10
|
+
*/
|
|
11
|
+
get(id: string): Promise<PromptTemplate>;
|
|
12
|
+
/**
|
|
13
|
+
* Get a specific version of a template
|
|
14
|
+
*/
|
|
15
|
+
getVersion(id: string, version: number): Promise<PromptTemplate>;
|
|
16
|
+
/**
|
|
17
|
+
* List all templates
|
|
18
|
+
*/
|
|
19
|
+
list(): Promise<PromptTemplate[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Create a new template
|
|
22
|
+
*/
|
|
23
|
+
create(input: CreatePromptTemplateInput): Promise<PromptTemplate>;
|
|
24
|
+
/**
|
|
25
|
+
* Update a template (creates a new version)
|
|
26
|
+
*/
|
|
27
|
+
update(id: string, input: UpdatePromptTemplateInput): Promise<PromptTemplate>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete a template
|
|
30
|
+
*/
|
|
31
|
+
delete(id: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Render a template by replacing {{varName}} with provided values
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const rendered = await promptService.render('greet-user', { name: 'Alice', app: 'MyApp' });
|
|
38
|
+
* // "Hello, Alice! Welcome to MyApp."
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
render(id: string, vars: Record<string, string>): Promise<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Render a specific version of a template
|
|
44
|
+
*/
|
|
45
|
+
renderVersion(id: string, version: number, vars: Record<string, string>): Promise<string>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/prompt/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBAGJ,OAAO,EAAE,mBAAmB;IAK5D;;OAEG;IACU,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMrD;;OAEG;IACU,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAM7E;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI9C;;OAEG;IACU,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAI9E;;OAEG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAI1F;;OAEG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjD;;;;;;;;OAQG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9E;;OAEG;IACU,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAIvG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PromptStore, PromptTemplate, CreatePromptTemplateInput, UpdatePromptTemplateInput } from '../types';
|
|
2
|
+
export interface FilePromptStoreConfig {
|
|
3
|
+
/** Directory containing JSON prompt files (default: './.prompts') */
|
|
4
|
+
promptsDir?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* File-backed prompt store — loads templates from JSON files at startup
|
|
8
|
+
* and persists changes back to disk.
|
|
9
|
+
*
|
|
10
|
+
* Each template is stored as a separate JSON file: `{promptsDir}/{id}.json`
|
|
11
|
+
*
|
|
12
|
+
* File format:
|
|
13
|
+
* ```json
|
|
14
|
+
* {
|
|
15
|
+
* "id": "greet-user",
|
|
16
|
+
* "name": "Greet User",
|
|
17
|
+
* "content": "Hello, {{name}}! Welcome to {{app}}.",
|
|
18
|
+
* "description": "Greeting template"
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class FilePromptStore implements PromptStore {
|
|
23
|
+
private readonly promptsDir;
|
|
24
|
+
private readonly memory;
|
|
25
|
+
private loaded;
|
|
26
|
+
constructor(config?: FilePromptStoreConfig);
|
|
27
|
+
get(id: string): Promise<PromptTemplate | null>;
|
|
28
|
+
getVersion(id: string, version: number): Promise<PromptTemplate | null>;
|
|
29
|
+
list(): Promise<PromptTemplate[]>;
|
|
30
|
+
create(input: CreatePromptTemplateInput): Promise<PromptTemplate>;
|
|
31
|
+
update(id: string, input: UpdatePromptTemplateInput): Promise<PromptTemplate>;
|
|
32
|
+
delete(id: string): Promise<boolean>;
|
|
33
|
+
private ensureLoaded;
|
|
34
|
+
private writeFile;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../../src/prompt/stores/file-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAIlB,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,MAAM,CAAS;gBAEJ,MAAM,GAAE,qBAA0B;IAKxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK/C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKvE,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAKjC,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAOjE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAO7E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAcnC,YAAY;YAiCZ,SAAS;CAkBxB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PromptStore, PromptTemplate, CreatePromptTemplateInput, UpdatePromptTemplateInput } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory prompt store. Supports versioning via a separate history map.
|
|
4
|
+
*/
|
|
5
|
+
export declare class InMemoryPromptStore implements PromptStore {
|
|
6
|
+
private readonly templates;
|
|
7
|
+
/** id → version → template snapshot */
|
|
8
|
+
private readonly history;
|
|
9
|
+
get(id: string): Promise<PromptTemplate | null>;
|
|
10
|
+
getVersion(id: string, version: number): Promise<PromptTemplate | null>;
|
|
11
|
+
list(): Promise<PromptTemplate[]>;
|
|
12
|
+
create(input: CreatePromptTemplateInput): Promise<PromptTemplate>;
|
|
13
|
+
update(id: string, input: UpdatePromptTemplateInput): Promise<PromptTemplate>;
|
|
14
|
+
delete(id: string): Promise<boolean>;
|
|
15
|
+
private saveVersion;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../../src/prompt/stores/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkD;IAE7D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI/C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAIvE,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIjC,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAqBjE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAoB7E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMjD,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A versioned prompt template with variable interpolation
|
|
3
|
+
*/
|
|
4
|
+
export interface PromptTemplate {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
/** Template content with {{variable}} placeholders */
|
|
8
|
+
content: string;
|
|
9
|
+
/** Current version number (starts at 1, increments on each update) */
|
|
10
|
+
version: number;
|
|
11
|
+
/** Declared variable names (auto-extracted from content) */
|
|
12
|
+
variables: string[];
|
|
13
|
+
/** Optional description */
|
|
14
|
+
description?: string;
|
|
15
|
+
createdAt: Date;
|
|
16
|
+
updatedAt: Date;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Input for creating a prompt template
|
|
20
|
+
*/
|
|
21
|
+
export interface CreatePromptTemplateInput {
|
|
22
|
+
id?: string;
|
|
23
|
+
name: string;
|
|
24
|
+
content: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Input for updating a prompt template (creates new version)
|
|
29
|
+
*/
|
|
30
|
+
export interface UpdatePromptTemplateInput {
|
|
31
|
+
name?: string;
|
|
32
|
+
content?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Abstract prompt store interface
|
|
37
|
+
*/
|
|
38
|
+
export interface PromptStore {
|
|
39
|
+
get(id: string): Promise<PromptTemplate | null>;
|
|
40
|
+
getVersion(id: string, version: number): Promise<PromptTemplate | null>;
|
|
41
|
+
list(): Promise<PromptTemplate[]>;
|
|
42
|
+
create(input: CreatePromptTemplateInput): Promise<PromptTemplate>;
|
|
43
|
+
update(id: string, input: UpdatePromptTemplateInput): Promise<PromptTemplate>;
|
|
44
|
+
delete(id: string): Promise<boolean>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* PromptModule configuration
|
|
48
|
+
*/
|
|
49
|
+
export interface PromptModuleOptions {
|
|
50
|
+
store?: PromptStore;
|
|
51
|
+
/**
|
|
52
|
+
* Preload templates on module init
|
|
53
|
+
* (only used by FilePromptStore, which loads from promptsDir)
|
|
54
|
+
*/
|
|
55
|
+
promptsDir?: string;
|
|
56
|
+
}
|
|
57
|
+
export declare const PROMPT_SERVICE_TOKEN: unique symbol;
|
|
58
|
+
export declare const PROMPT_OPTIONS_TOKEN: unique symbol;
|
|
59
|
+
/**
|
|
60
|
+
* Extract variable names from template content
|
|
61
|
+
* Matches {{varName}} patterns
|
|
62
|
+
*/
|
|
63
|
+
export declare function extractVariables(content: string): string[];
|
|
64
|
+
/**
|
|
65
|
+
* Render a template by replacing {{varName}} with provided values
|
|
66
|
+
*/
|
|
67
|
+
export declare function renderTemplate(content: string, vars: Record<string, string>): string;
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACxE,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,eAA8C,CAAC;AAChF,eAAO,MAAM,oBAAoB,eAA8C,CAAC;AAEhF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEpF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DocumentChunker, DocumentChunk } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Splits Markdown text into semantic chunks by heading boundaries.
|
|
4
|
+
* Falls back to text chunking for sections that are too large.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MarkdownChunker implements DocumentChunker {
|
|
7
|
+
private readonly maxChunkSize;
|
|
8
|
+
constructor(maxChunkSize?: number);
|
|
9
|
+
chunk(text: string): DocumentChunk[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=markdown-chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-chunker.d.ts","sourceRoot":"","sources":["../../../src/rag/chunkers/markdown-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/D;;;GAGG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAEnB,YAAY,SAAO;IAI/B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;CA0B5C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DocumentChunker, DocumentChunk } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Splits plain text into overlapping chunks of fixed character size.
|
|
4
|
+
*/
|
|
5
|
+
export declare class TextChunker implements DocumentChunker {
|
|
6
|
+
private readonly chunkSize;
|
|
7
|
+
private readonly chunkOverlap;
|
|
8
|
+
constructor(chunkSize?: number, chunkOverlap?: number);
|
|
9
|
+
chunk(text: string): DocumentChunk[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=text-chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-chunker.d.ts","sourceRoot":"","sources":["../../../src/rag/chunkers/text-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/D;;GAEG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAEnB,SAAS,SAAM,EAAE,YAAY,SAAK;IAK9C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;CAe5C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata key for @Rag() decorator
|
|
3
|
+
*/
|
|
4
|
+
export declare const RAG_METADATA_KEY = "@dangao/bun-server:rag:collection";
|
|
5
|
+
/**
|
|
6
|
+
* Mark a controller method to auto-retrieve RAG context before execution.
|
|
7
|
+
* The retrieved context is available via `@Inject(RAG_SERVICE_TOKEN)` in the service layer.
|
|
8
|
+
*
|
|
9
|
+
* @param collection - VectorStore collection to search (uses default if omitted)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* \@POST('/ask')
|
|
14
|
+
* \@Rag({ collection: 'product-docs' })
|
|
15
|
+
* public async ask(\@Body() body: { question: string }) {
|
|
16
|
+
* // RAG context is automatically fetched before this method
|
|
17
|
+
* // Access via RagService.retrieve() in your service
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function Rag(options?: {
|
|
22
|
+
collection?: string;
|
|
23
|
+
}): MethodDecorator;
|
|
24
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/rag/decorators.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,gBAAgB,sCAAsC,CAAC;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,GAAG,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,eAAe,CAI1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rag/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type RagModuleOptions } from './types';
|
|
2
|
+
export declare class RagModule {
|
|
3
|
+
/**
|
|
4
|
+
* Configure the RAG module.
|
|
5
|
+
*
|
|
6
|
+
* **Requires** `EmbeddingModule` and `VectorStoreModule` to be imported first.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* EmbeddingModule.forRoot({ provider: { ... } });
|
|
11
|
+
* VectorStoreModule.forRoot({});
|
|
12
|
+
* RagModule.forRoot({ collection: 'docs', chunkSize: 512, topK: 5 });
|
|
13
|
+
*
|
|
14
|
+
* \@Module({
|
|
15
|
+
* imports: [EmbeddingModule, VectorStoreModule, RagModule],
|
|
16
|
+
* })
|
|
17
|
+
* class AppModule {}
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
static forRoot(options?: RagModuleOptions): typeof RagModule;
|
|
21
|
+
static reset(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=rag-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-module.d.ts","sourceRoot":"","sources":["../../src/rag/rag-module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAwC,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAMtF,qBAIa,SAAS;IACpB;;;;;;;;;;;;;;;;OAgBG;WACW,OAAO,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,SAAS;WA0CzD,KAAK,IAAI,IAAI;CAG5B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { EmbeddingService } from '../embedding/service';
|
|
2
|
+
import type { VectorStore } from '../vector-store/types';
|
|
3
|
+
import type { IngestSource, RagContext, RagModuleOptions } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* RAG service — document ingestion pipeline and context retrieval.
|
|
6
|
+
*
|
|
7
|
+
* Ingestion: source → load text → chunk → embed → store in VectorStore
|
|
8
|
+
* Retrieval: query → embed → search VectorStore → format context
|
|
9
|
+
*/
|
|
10
|
+
export declare class RagService {
|
|
11
|
+
private readonly options;
|
|
12
|
+
private readonly embeddingService;
|
|
13
|
+
private readonly vectorStore;
|
|
14
|
+
private readonly textChunker;
|
|
15
|
+
private readonly markdownChunker;
|
|
16
|
+
constructor(options: RagModuleOptions, embeddingService: EmbeddingService, vectorStore: VectorStore);
|
|
17
|
+
/**
|
|
18
|
+
* Ingest a document source into the vector store
|
|
19
|
+
* @param source - text, file path, or URL
|
|
20
|
+
* @param collection - override default collection
|
|
21
|
+
* @returns Number of chunks stored
|
|
22
|
+
*/
|
|
23
|
+
ingest(source: IngestSource, collection?: string): Promise<number>;
|
|
24
|
+
/**
|
|
25
|
+
* Retrieve relevant context for a query
|
|
26
|
+
* @param query - User query text
|
|
27
|
+
* @param collection - override default collection
|
|
28
|
+
*/
|
|
29
|
+
retrieve(query: string, collection?: string): Promise<RagContext>;
|
|
30
|
+
/**
|
|
31
|
+
* Build a system prompt with retrieved context
|
|
32
|
+
*/
|
|
33
|
+
buildContextPrompt(query: string, collection?: string): Promise<string>;
|
|
34
|
+
private loadText;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/rag/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAmB,MAAM,SAAS,CAAC;AAK3F;;;;;GAKG;AACH,qBACa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAGrB,OAAO,EAAE,gBAAgB,EACnB,gBAAgB,EAAE,gBAAgB,EACvC,WAAW,EAAE,WAAW;IAStD;;;;;OAKG;IACU,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC/E;;;;OAIG;IACU,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuB9E;;OAEG;IACU,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAMtE,QAAQ;CAiBvB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A chunk of text produced by a document chunker
|
|
3
|
+
*/
|
|
4
|
+
export interface DocumentChunk {
|
|
5
|
+
content: string;
|
|
6
|
+
metadata?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Source for document ingestion
|
|
10
|
+
*/
|
|
11
|
+
export type IngestSource = {
|
|
12
|
+
type: 'text';
|
|
13
|
+
content: string;
|
|
14
|
+
metadata?: Record<string, unknown>;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'file';
|
|
17
|
+
path: string;
|
|
18
|
+
metadata?: Record<string, unknown>;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'url';
|
|
21
|
+
url: string;
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Abstract document chunker
|
|
26
|
+
*/
|
|
27
|
+
export interface DocumentChunker {
|
|
28
|
+
chunk(text: string): DocumentChunk[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Retrieved context for RAG
|
|
32
|
+
*/
|
|
33
|
+
export interface RagContext {
|
|
34
|
+
chunks: Array<{
|
|
35
|
+
content: string;
|
|
36
|
+
score: number;
|
|
37
|
+
metadata?: Record<string, unknown>;
|
|
38
|
+
}>;
|
|
39
|
+
/** Formatted context string for inclusion in prompts */
|
|
40
|
+
formatted: string;
|
|
41
|
+
}
|
|
42
|
+
export interface RagModuleOptions {
|
|
43
|
+
/** Collection name in VectorStore (default: 'rag') */
|
|
44
|
+
collection?: string;
|
|
45
|
+
/** Number of chunks per ingested document (default: 512) */
|
|
46
|
+
chunkSize?: number;
|
|
47
|
+
/** Overlap between consecutive chunks (default: 50) */
|
|
48
|
+
chunkOverlap?: number;
|
|
49
|
+
/** Number of top results to retrieve (default: 5) */
|
|
50
|
+
topK?: number;
|
|
51
|
+
/** Minimum similarity score to include (default: 0.5) */
|
|
52
|
+
minScore?: number;
|
|
53
|
+
}
|
|
54
|
+
export declare const RAG_SERVICE_TOKEN: unique symbol;
|
|
55
|
+
export declare const RAG_OPTIONS_TOKEN: unique symbol;
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rag/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACtF,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,eAA2C,CAAC;AAC1E,eAAO,MAAM,iBAAiB,eAA2C,CAAC"}
|