@flutchai/flutch-sdk 0.1.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 +287 -0
- package/dist/api/callback-token.guard.d.ts +17 -0
- package/dist/api/callback-token.guard.js +80 -0
- package/dist/api/callback-token.guard.js.map +1 -0
- package/dist/api/callback.controller.d.ts +7 -0
- package/dist/api/callback.controller.js +44 -0
- package/dist/api/callback.controller.js.map +1 -0
- package/dist/api/graph.controller.d.ts +32 -0
- package/dist/api/graph.controller.js +187 -0
- package/dist/api/graph.controller.js.map +1 -0
- package/dist/api/ui-dispatch.controller.d.ts +34 -0
- package/dist/api/ui-dispatch.controller.js +178 -0
- package/dist/api/ui-dispatch.controller.js.map +1 -0
- package/dist/bootstrap.d.ts +4 -0
- package/dist/bootstrap.js +177 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/callbacks/callback-acl.service.d.ts +24 -0
- package/dist/callbacks/callback-acl.service.js +144 -0
- package/dist/callbacks/callback-acl.service.js.map +1 -0
- package/dist/callbacks/callback-auditor.service.d.ts +47 -0
- package/dist/callbacks/callback-auditor.service.js +286 -0
- package/dist/callbacks/callback-auditor.service.js.map +1 -0
- package/dist/callbacks/callback-metrics.service.d.ts +34 -0
- package/dist/callbacks/callback-metrics.service.js +216 -0
- package/dist/callbacks/callback-metrics.service.js.map +1 -0
- package/dist/callbacks/callback-patch.service.d.ts +13 -0
- package/dist/callbacks/callback-patch.service.js +51 -0
- package/dist/callbacks/callback-patch.service.js.map +1 -0
- package/dist/callbacks/callback-rate-limiter.d.ts +27 -0
- package/dist/callbacks/callback-rate-limiter.js +129 -0
- package/dist/callbacks/callback-rate-limiter.js.map +1 -0
- package/dist/callbacks/callback-registry.d.ts +7 -0
- package/dist/callbacks/callback-registry.js +29 -0
- package/dist/callbacks/callback-registry.js.map +1 -0
- package/dist/callbacks/callback-store.d.ts +19 -0
- package/dist/callbacks/callback-store.js +145 -0
- package/dist/callbacks/callback-store.js.map +1 -0
- package/dist/callbacks/example.callback.d.ts +2 -0
- package/dist/callbacks/example.callback.js +10 -0
- package/dist/callbacks/example.callback.js.map +1 -0
- package/dist/callbacks/idempotency-manager.d.ts +54 -0
- package/dist/callbacks/idempotency-manager.js +230 -0
- package/dist/callbacks/idempotency-manager.js.map +1 -0
- package/dist/callbacks/index.d.ts +13 -0
- package/dist/callbacks/index.js +30 -0
- package/dist/callbacks/index.js.map +1 -0
- package/dist/callbacks/smart-callback.router.d.ts +52 -0
- package/dist/callbacks/smart-callback.router.js +213 -0
- package/dist/callbacks/smart-callback.router.js.map +1 -0
- package/dist/callbacks/telegram-patch.handler.d.ts +6 -0
- package/dist/callbacks/telegram-patch.handler.js +24 -0
- package/dist/callbacks/telegram-patch.handler.js.map +1 -0
- package/dist/callbacks/universal-callback.service.d.ts +14 -0
- package/dist/callbacks/universal-callback.service.js +20 -0
- package/dist/callbacks/universal-callback.service.js.map +1 -0
- package/dist/callbacks/web-patch.handler.d.ts +6 -0
- package/dist/callbacks/web-patch.handler.js +24 -0
- package/dist/callbacks/web-patch.handler.js.map +1 -0
- package/dist/core/abstract-graph.builder.d.ts +128 -0
- package/dist/core/abstract-graph.builder.js +488 -0
- package/dist/core/abstract-graph.builder.js.map +1 -0
- package/dist/core/builder-registry.service.d.ts +6 -0
- package/dist/core/builder-registry.service.js +29 -0
- package/dist/core/builder-registry.service.js.map +1 -0
- package/dist/core/universal-graph.module.d.ts +10 -0
- package/dist/core/universal-graph.module.js +294 -0
- package/dist/core/universal-graph.module.js.map +1 -0
- package/dist/decorators/callback.decorators.d.ts +21 -0
- package/dist/decorators/callback.decorators.js +73 -0
- package/dist/decorators/callback.decorators.js.map +1 -0
- package/dist/endpoint-registry/endpoint.decorators.d.ts +35 -0
- package/dist/endpoint-registry/endpoint.decorators.js +115 -0
- package/dist/endpoint-registry/endpoint.decorators.js.map +1 -0
- package/dist/endpoint-registry/endpoint.registry.d.ts +44 -0
- package/dist/endpoint-registry/endpoint.registry.js +90 -0
- package/dist/endpoint-registry/endpoint.registry.js.map +1 -0
- package/dist/endpoint-registry/index.d.ts +3 -0
- package/dist/endpoint-registry/index.js +20 -0
- package/dist/endpoint-registry/index.js.map +1 -0
- package/dist/endpoint-registry/ui-endpoints.discovery.d.ts +11 -0
- package/dist/endpoint-registry/ui-endpoints.discovery.js +72 -0
- package/dist/endpoint-registry/ui-endpoints.discovery.js.map +1 -0
- package/dist/engine/api-call-tracer.utils.d.ts +8 -0
- package/dist/engine/api-call-tracer.utils.js +184 -0
- package/dist/engine/api-call-tracer.utils.js.map +1 -0
- package/dist/engine/event-processor.utils.d.ts +49 -0
- package/dist/engine/event-processor.utils.js +314 -0
- package/dist/engine/event-processor.utils.js.map +1 -0
- package/dist/engine/graph-engine.factory.d.ts +12 -0
- package/dist/engine/graph-engine.factory.js +43 -0
- package/dist/engine/graph-engine.factory.js.map +1 -0
- package/dist/engine/langgraph-engine.d.ts +14 -0
- package/dist/engine/langgraph-engine.js +261 -0
- package/dist/engine/langgraph-engine.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/callback.interface.d.ts +46 -0
- package/dist/interfaces/callback.interface.js +3 -0
- package/dist/interfaces/callback.interface.js.map +1 -0
- package/dist/interfaces/graph-registry.interface.d.ts +8 -0
- package/dist/interfaces/graph-registry.interface.js +3 -0
- package/dist/interfaces/graph-registry.interface.js.map +1 -0
- package/dist/interfaces/graph-service.interface.d.ts +43 -0
- package/dist/interfaces/graph-service.interface.js +9 -0
- package/dist/interfaces/graph-service.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +3 -0
- package/dist/interfaces/index.js +20 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/llm/index.d.ts +6 -0
- package/dist/llm/index.js +23 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm.initializer.d.ts +14 -0
- package/dist/llm/llm.initializer.js +167 -0
- package/dist/llm/llm.initializer.js.map +1 -0
- package/dist/llm/llm.interface.d.ts +6 -0
- package/dist/llm/llm.interface.js +3 -0
- package/dist/llm/llm.interface.js.map +1 -0
- package/dist/llm/llm.types.d.ts +32 -0
- package/dist/llm/llm.types.js +3 -0
- package/dist/llm/llm.types.js.map +1 -0
- package/dist/llm/model.initializer.d.ts +45 -0
- package/dist/llm/model.initializer.js +630 -0
- package/dist/llm/model.initializer.js.map +1 -0
- package/dist/llm/model.interface.d.ts +38 -0
- package/dist/llm/model.interface.js +4 -0
- package/dist/llm/model.interface.js.map +1 -0
- package/dist/llm/rerankers/voyageai-rerank.d.ts +17 -0
- package/dist/llm/rerankers/voyageai-rerank.js +56 -0
- package/dist/llm/rerankers/voyageai-rerank.js.map +1 -0
- package/dist/retriever/database-factory.d.ts +15 -0
- package/dist/retriever/database-factory.js +83 -0
- package/dist/retriever/database-factory.js.map +1 -0
- package/dist/retriever/index.d.ts +2 -0
- package/dist/retriever/index.js +19 -0
- package/dist/retriever/index.js.map +1 -0
- package/dist/retriever/retriever.client.d.ts +28 -0
- package/dist/retriever/retriever.client.js +97 -0
- package/dist/retriever/retriever.client.js.map +1 -0
- package/dist/retriever/retriever.service.d.ts +25 -0
- package/dist/retriever/retriever.service.js +265 -0
- package/dist/retriever/retriever.service.js.map +1 -0
- package/dist/retriever/types.d.ts +22 -0
- package/dist/retriever/types.js +3 -0
- package/dist/retriever/types.js.map +1 -0
- package/dist/schemas/graph-manifest.schema.d.ts +134 -0
- package/dist/schemas/graph-manifest.schema.js +180 -0
- package/dist/schemas/graph-manifest.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.js +18 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/shared-types/index.d.ts +199 -0
- package/dist/shared-types/index.js +58 -0
- package/dist/shared-types/index.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-converter.d.ts +15 -0
- package/dist/tools/mcp-converter.js +133 -0
- package/dist/tools/mcp-converter.js.map +1 -0
- package/dist/tools/mcp-tool-filter.d.ts +11 -0
- package/dist/tools/mcp-tool-filter.js +123 -0
- package/dist/tools/mcp-tool-filter.js.map +1 -0
- package/dist/tools/mcp.interfaces.d.ts +19 -0
- package/dist/tools/mcp.interfaces.js +3 -0
- package/dist/tools/mcp.interfaces.js.map +1 -0
- package/dist/types/graph-types.d.ts +82 -0
- package/dist/types/graph-types.js +6 -0
- package/dist/types/graph-types.js.map +1 -0
- package/dist/utils/error.utils.d.ts +18 -0
- package/dist/utils/error.utils.js +78 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/graph-type.utils.d.ts +14 -0
- package/dist/utils/graph-type.utils.js +71 -0
- package/dist/utils/graph-type.utils.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/usage-recorder.d.ts +23 -0
- package/dist/utils/usage-recorder.js +29 -0
- package/dist/utils/usage-recorder.js.map +1 -0
- package/dist/versioning/index.d.ts +2 -0
- package/dist/versioning/index.js +19 -0
- package/dist/versioning/index.js.map +1 -0
- package/dist/versioning/versioned-graph.service.d.ts +16 -0
- package/dist/versioning/versioned-graph.service.js +132 -0
- package/dist/versioning/versioned-graph.service.js.map +1 -0
- package/dist/versioning/versioning.types.d.ts +21 -0
- package/dist/versioning/versioning.types.js +3 -0
- package/dist/versioning/versioning.types.js.map +1 -0
- package/package.json +70 -0
package/README.md
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# @flutchai/flutch-sdk
|
|
2
|
+
|
|
3
|
+
Base infrastructure package for building graph microservices in the Amelie AI platform.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`sdk` is the foundation package that provides all the essential components needed to build, run, and manage graph-based microservices. It's designed to be self-contained with minimal external dependencies.
|
|
8
|
+
|
|
9
|
+
## What's Included
|
|
10
|
+
|
|
11
|
+
### Core Components
|
|
12
|
+
|
|
13
|
+
- **UniversalGraphModule** - NestJS module for bootstrapping graph services
|
|
14
|
+
- **AbstractGraphBuilder** - Base class for implementing graph builders
|
|
15
|
+
- **GraphController** - REST API controller with standard endpoints
|
|
16
|
+
- **CallbackController** - Callback system for interactive flows
|
|
17
|
+
|
|
18
|
+
### Interfaces & Types
|
|
19
|
+
|
|
20
|
+
- **IGraphService** - Standard interface for all graph services
|
|
21
|
+
- **IGraphRequestPayload** / **IGraphResponsePayload** - Request/response contracts
|
|
22
|
+
- **IGraphRunnableConfig** - Graph execution configuration
|
|
23
|
+
- **CallbackRecord** / **CallbackResult** - Callback system types
|
|
24
|
+
- **Graph type registry** - Type-safe graph definitions
|
|
25
|
+
|
|
26
|
+
### Engine Components
|
|
27
|
+
|
|
28
|
+
- **LangGraphEngine** - LangGraph.js integration
|
|
29
|
+
- **EventProcessor** - Stream event processing with metrics collection
|
|
30
|
+
- **ApiCallTracer** - API call tracing and sanitization utilities
|
|
31
|
+
|
|
32
|
+
### Validation & Schemas
|
|
33
|
+
|
|
34
|
+
- **GraphManifestSchema** - JSON Schema for graph manifests
|
|
35
|
+
- **GraphManifestValidator** - Manifest validation utilities
|
|
36
|
+
|
|
37
|
+
### Utilities
|
|
38
|
+
|
|
39
|
+
- **GraphTypeUtils** - Version parsing and normalization
|
|
40
|
+
- Parse: `global.simple::1.2.0` → `{ companyId, name, version }`
|
|
41
|
+
- Build: `build("global", "simple", "1.2.0")` → `global.simple::1.2.0`
|
|
42
|
+
- Normalize: Handle legacy formats
|
|
43
|
+
|
|
44
|
+
### Callback System
|
|
45
|
+
|
|
46
|
+
Complete callback infrastructure for interactive user flows:
|
|
47
|
+
|
|
48
|
+
- Token-based callback registration
|
|
49
|
+
- ACL and security checks
|
|
50
|
+
- Idempotency management
|
|
51
|
+
- Platform-specific handlers (Web, Telegram)
|
|
52
|
+
- Audit logging
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
55
|
+
|
|
56
|
+
This is a workspace package - install via workspace root:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
yarn install
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Usage
|
|
63
|
+
|
|
64
|
+
### Creating a Graph Service
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import {
|
|
68
|
+
UniversalGraphModule,
|
|
69
|
+
AbstractGraphBuilder,
|
|
70
|
+
IGraphRunnableConfig,
|
|
71
|
+
} from "@flutchai/flutch-sdk";
|
|
72
|
+
|
|
73
|
+
@Injectable()
|
|
74
|
+
export class MyGraphBuilder extends AbstractGraphBuilder<"myGraph"> {
|
|
75
|
+
async buildGraph(config?: any): Promise<CompiledGraphFor<"myGraph">> {
|
|
76
|
+
// Build your LangGraph here
|
|
77
|
+
return compiledGraph;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Module({
|
|
82
|
+
imports: [
|
|
83
|
+
UniversalGraphModule.register({
|
|
84
|
+
graphType: "myGraph",
|
|
85
|
+
builder: MyGraphBuilder,
|
|
86
|
+
// ... other config
|
|
87
|
+
}),
|
|
88
|
+
],
|
|
89
|
+
})
|
|
90
|
+
export class MyGraphModule {}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Using GraphTypeUtils
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { GraphTypeUtils } from "@flutchai/flutch-sdk";
|
|
97
|
+
|
|
98
|
+
// Parse versioned graph types
|
|
99
|
+
const parsed = GraphTypeUtils.parse("global.simple::1.2.0");
|
|
100
|
+
// → { companyId: "global", name: "simple", version: "1.2.0" }
|
|
101
|
+
|
|
102
|
+
// Build graph type string
|
|
103
|
+
const fullType = GraphTypeUtils.build("company-123", "customRag", "2.0.0");
|
|
104
|
+
// → "company-123.customRag::2.0.0"
|
|
105
|
+
|
|
106
|
+
// Normalize legacy formats
|
|
107
|
+
const normalized = GraphTypeUtils.normalize("simple");
|
|
108
|
+
// → "global.simple"
|
|
109
|
+
|
|
110
|
+
// Extract version
|
|
111
|
+
const version = GraphTypeUtils.getVersion("global.rag::1.5.0");
|
|
112
|
+
// → "1.5.0"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Validating Graph Manifests
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { GraphManifestValidator } from "@flutchai/flutch-sdk";
|
|
119
|
+
|
|
120
|
+
const manifest = {
|
|
121
|
+
graphType: "myGraph",
|
|
122
|
+
title: "My Custom Graph",
|
|
123
|
+
description: "Does cool things",
|
|
124
|
+
// ... other fields
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// Validate and get result
|
|
128
|
+
const result = GraphManifestValidator.validate(manifest);
|
|
129
|
+
if (!result.isValid) {
|
|
130
|
+
console.error(result.errors);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Or throw on invalid
|
|
134
|
+
GraphManifestValidator.validateOrThrow(manifest);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Processing Stream Events
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
import { EventProcessor, StreamAccumulator } from "@flutchai/flutch-sdk";
|
|
141
|
+
|
|
142
|
+
@Injectable()
|
|
143
|
+
export class MyService {
|
|
144
|
+
constructor(private eventProcessor: EventProcessor) {}
|
|
145
|
+
|
|
146
|
+
async processStream(stream: any): Promise<IGraphResponsePayload> {
|
|
147
|
+
const accumulator = this.eventProcessor.createAccumulator();
|
|
148
|
+
|
|
149
|
+
for await (const event of stream) {
|
|
150
|
+
this.eventProcessor.processEvent(
|
|
151
|
+
accumulator,
|
|
152
|
+
event,
|
|
153
|
+
chunk => console.log(chunk) // Partial callback
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return this.eventProcessor.getResult(accumulator);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Architecture
|
|
163
|
+
|
|
164
|
+
### Package Structure
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
src/
|
|
168
|
+
├── api/ # REST controllers and guards
|
|
169
|
+
├── bootstrap.ts # Service bootstrap utilities
|
|
170
|
+
├── callbacks/ # Callback system implementation
|
|
171
|
+
├── core/ # Core modules and builders
|
|
172
|
+
├── decorators/ # Custom decorators
|
|
173
|
+
├── endpoint-registry # Endpoint registration
|
|
174
|
+
├── engine/ # Graph execution engines
|
|
175
|
+
├── interfaces/ # TypeScript interfaces
|
|
176
|
+
├── schemas/ # JSON schemas
|
|
177
|
+
├── types/ # TypeScript type definitions
|
|
178
|
+
├── utils/ # Utility functions
|
|
179
|
+
└── versioning/ # Version management
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Dependencies
|
|
183
|
+
|
|
184
|
+
**Internal:**
|
|
185
|
+
|
|
186
|
+
- `@amelie/shared-types` - Base type definitions
|
|
187
|
+
- `@amelie/graph-service-registry` - Service discovery (runtime only)
|
|
188
|
+
|
|
189
|
+
**External:**
|
|
190
|
+
|
|
191
|
+
- `@nestjs/*` - NestJS framework
|
|
192
|
+
- `@langchain/langgraph` - Graph orchestration
|
|
193
|
+
- `ioredis` - Redis client for callbacks
|
|
194
|
+
- `helmet`, `compression` - HTTP middleware
|
|
195
|
+
|
|
196
|
+
### Design Principles
|
|
197
|
+
|
|
198
|
+
1. **Self-contained** - Minimal internal dependencies
|
|
199
|
+
2. **Type-safe** - Comprehensive TypeScript definitions
|
|
200
|
+
3. **Modular** - Use only what you need
|
|
201
|
+
4. **Backward compatible** - Graceful migration paths
|
|
202
|
+
5. **Framework agnostic** - Core types work anywhere
|
|
203
|
+
|
|
204
|
+
## Migration Guide
|
|
205
|
+
|
|
206
|
+
If you were using types from `@amelie/graph-service-core` or `@amelie/graph-utils`:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
// ❌ Old imports
|
|
210
|
+
import { IGraphService } from "@amelie/graph-service-core";
|
|
211
|
+
import { EventProcessor } from "@amelie/graph-utils";
|
|
212
|
+
|
|
213
|
+
// ✅ New imports
|
|
214
|
+
import { IGraphService, EventProcessor } from "@flutchai/flutch-sdk";
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
All old imports are marked `@deprecated` but still work for backward compatibility.
|
|
218
|
+
|
|
219
|
+
## API
|
|
220
|
+
|
|
221
|
+
### Main Exports
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// Core
|
|
225
|
+
export { UniversalGraphModule, AbstractGraphBuilder };
|
|
226
|
+
|
|
227
|
+
// Interfaces
|
|
228
|
+
export {
|
|
229
|
+
IGraphService,
|
|
230
|
+
IGraphRequestPayload,
|
|
231
|
+
IGraphResponsePayload,
|
|
232
|
+
CallbackRecord,
|
|
233
|
+
CallbackResult,
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
// Engine
|
|
237
|
+
export { LangGraphEngine, EventProcessor, ApiCallTracer };
|
|
238
|
+
|
|
239
|
+
// Utilities
|
|
240
|
+
export { GraphTypeUtils, GraphManifestValidator };
|
|
241
|
+
|
|
242
|
+
// Types
|
|
243
|
+
export { IGraphTypeRegistry, CompiledGraphFor, BaseGraphState };
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
See `src/index.ts` for complete export list.
|
|
247
|
+
|
|
248
|
+
## Development
|
|
249
|
+
|
|
250
|
+
### Building
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
yarn workspace @flutchai/flutch-sdk build
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Testing
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
yarn workspace @flutchai/flutch-sdk test
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Linting
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
yarn workspace @flutchai/flutch-sdk lint
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Contributing
|
|
269
|
+
|
|
270
|
+
When adding new features to sdk:
|
|
271
|
+
|
|
272
|
+
1. **Keep it generic** - This is base infrastructure
|
|
273
|
+
2. **Type everything** - Export proper TypeScript interfaces
|
|
274
|
+
3. **Document well** - Add JSDoc comments
|
|
275
|
+
4. **Test thoroughly** - Add unit tests for new utilities
|
|
276
|
+
5. **Export properly** - Add to appropriate section in `index.ts`
|
|
277
|
+
|
|
278
|
+
## Version History
|
|
279
|
+
|
|
280
|
+
- **0.1.0** - Initial self-contained release
|
|
281
|
+
- Migrated core interfaces from graph-service-core
|
|
282
|
+
- Migrated utilities from graph-utils
|
|
283
|
+
- Removed external graph-services dependencies
|
|
284
|
+
|
|
285
|
+
## License
|
|
286
|
+
|
|
287
|
+
Proprietary - Amelie AI Platform
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from "@nestjs/common";
|
|
2
|
+
import { Request } from "express";
|
|
3
|
+
import { CallbackStore } from "../callbacks";
|
|
4
|
+
import { CallbackRecord } from "../interfaces/callback.interface";
|
|
5
|
+
import { CallbackACL, CallbackUser } from "../callbacks/callback-acl.service";
|
|
6
|
+
export interface CallbackRequest extends Request {
|
|
7
|
+
callbackRecord: CallbackRecord;
|
|
8
|
+
user?: CallbackUser;
|
|
9
|
+
}
|
|
10
|
+
export declare class CallbackTokenGuard implements CanActivate {
|
|
11
|
+
private readonly store;
|
|
12
|
+
private readonly acl;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
constructor(store: CallbackStore, acl: CallbackACL);
|
|
15
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
16
|
+
private extractUser;
|
|
17
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var CallbackTokenGuard_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.CallbackTokenGuard = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const callbacks_1 = require("../callbacks");
|
|
16
|
+
const callback_acl_service_1 = require("../callbacks/callback-acl.service");
|
|
17
|
+
let CallbackTokenGuard = CallbackTokenGuard_1 = class CallbackTokenGuard {
|
|
18
|
+
constructor(store, acl) {
|
|
19
|
+
this.store = store;
|
|
20
|
+
this.acl = acl;
|
|
21
|
+
this.logger = new common_1.Logger(CallbackTokenGuard_1.name);
|
|
22
|
+
}
|
|
23
|
+
async canActivate(context) {
|
|
24
|
+
var _a;
|
|
25
|
+
const request = context.switchToHttp().getRequest();
|
|
26
|
+
const token = (_a = request.body) === null || _a === void 0 ? void 0 : _a.token;
|
|
27
|
+
if (!token) {
|
|
28
|
+
throw new common_1.UnauthorizedException("Callback token missing");
|
|
29
|
+
}
|
|
30
|
+
const record = await this.store.getAndLock(token);
|
|
31
|
+
if (!record) {
|
|
32
|
+
throw new common_1.UnauthorizedException("Invalid callback token");
|
|
33
|
+
}
|
|
34
|
+
const user = this.extractUser(request);
|
|
35
|
+
await this.acl.validate(user, record);
|
|
36
|
+
request.callbackRecord = record;
|
|
37
|
+
request.user = user;
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
extractUser(request) {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
this.logger.log(`Extracting user from request`, {
|
|
43
|
+
hasRequestUser: !!request.user,
|
|
44
|
+
hasPlatformContext: !!((_a = request.body) === null || _a === void 0 ? void 0 : _a.platformContext),
|
|
45
|
+
platformContextKeys: ((_b = request.body) === null || _b === void 0 ? void 0 : _b.platformContext)
|
|
46
|
+
? Object.keys(request.body.platformContext)
|
|
47
|
+
: [],
|
|
48
|
+
});
|
|
49
|
+
if (request.user) {
|
|
50
|
+
this.logger.log(`Found user from JWT middleware: ${request.user["id"] || request.user["sub"]}`);
|
|
51
|
+
return {
|
|
52
|
+
userId: request.user["id"] || request.user["sub"],
|
|
53
|
+
roles: request.user["roles"],
|
|
54
|
+
permissions: request.user["permissions"],
|
|
55
|
+
companyId: request.user["companyId"],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const platformContext = (_c = request.body) === null || _c === void 0 ? void 0 : _c.platformContext;
|
|
59
|
+
if (platformContext &&
|
|
60
|
+
platformContext.userId &&
|
|
61
|
+
platformContext.authenticated) {
|
|
62
|
+
this.logger.log(`Found user from platformContext: ${platformContext.userId}`);
|
|
63
|
+
return {
|
|
64
|
+
userId: platformContext.userId,
|
|
65
|
+
roles: platformContext.roles || [],
|
|
66
|
+
permissions: platformContext.permissions || [],
|
|
67
|
+
companyId: platformContext.companyId,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
this.logger.warn(`No user found in request or platformContext`);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.CallbackTokenGuard = CallbackTokenGuard;
|
|
75
|
+
exports.CallbackTokenGuard = CallbackTokenGuard = CallbackTokenGuard_1 = __decorate([
|
|
76
|
+
(0, common_1.Injectable)(),
|
|
77
|
+
__metadata("design:paramtypes", [callbacks_1.CallbackStore,
|
|
78
|
+
callback_acl_service_1.CallbackACL])
|
|
79
|
+
], CallbackTokenGuard);
|
|
80
|
+
//# sourceMappingURL=callback-token.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-token.guard.js","sourceRoot":"","sources":["../../src/api/callback-token.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { UniversalCallbackService } from "../callbacks";
|
|
2
|
+
import { CallbackRequest } from "./callback-token.guard";
|
|
3
|
+
export declare class CallbackController {
|
|
4
|
+
private readonly callbackService;
|
|
5
|
+
constructor(callbackService: UniversalCallbackService);
|
|
6
|
+
handleCallback(req: CallbackRequest): Promise<import("..").CallbackResult>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CallbackController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const callbacks_1 = require("../callbacks");
|
|
19
|
+
const callback_token_guard_1 = require("./callback-token.guard");
|
|
20
|
+
let CallbackController = class CallbackController {
|
|
21
|
+
constructor(callbackService) {
|
|
22
|
+
this.callbackService = callbackService;
|
|
23
|
+
}
|
|
24
|
+
async handleCallback(req) {
|
|
25
|
+
return this.callbackService.handle(req.callbackRecord, req.user);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.CallbackController = CallbackController;
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, common_1.Post)("callback"),
|
|
31
|
+
(0, common_1.UseGuards)(callback_token_guard_1.CallbackTokenGuard),
|
|
32
|
+
(0, swagger_1.ApiOperation)({ summary: "Process callback by token" }),
|
|
33
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Callback executed" }),
|
|
34
|
+
__param(0, (0, common_1.Req)()),
|
|
35
|
+
__metadata("design:type", Function),
|
|
36
|
+
__metadata("design:paramtypes", [Object]),
|
|
37
|
+
__metadata("design:returntype", Promise)
|
|
38
|
+
], CallbackController.prototype, "handleCallback", null);
|
|
39
|
+
exports.CallbackController = CallbackController = __decorate([
|
|
40
|
+
(0, swagger_1.ApiTags)("Callbacks"),
|
|
41
|
+
(0, common_1.Controller)(),
|
|
42
|
+
__metadata("design:paramtypes", [callbacks_1.UniversalCallbackService])
|
|
43
|
+
], CallbackController);
|
|
44
|
+
//# sourceMappingURL=callback.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback.controller.js","sourceRoot":"","sources":["../../src/api/callback.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkE;AAClE,6CAAqE;AACrE,4CAAwD;AACxD,iEAA6E;AAItE,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAA6B,eAAyC;QAAzC,oBAAe,GAAf,eAAe,CAA0B;IAAG,CAAC;IAMpE,AAAN,KAAK,CAAC,cAAc,CAAQ,GAAoB;QAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;CACF,CAAA;AAVY,gDAAkB;AAOvB;IAJL,IAAA,aAAI,EAAC,UAAU,CAAC;IAChB,IAAA,kBAAS,EAAC,yCAAkB,CAAC;IAC7B,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACtD,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACzC,WAAA,IAAA,YAAG,GAAE,CAAA;;;;wDAE1B;6BATU,kBAAkB;IAF9B,IAAA,iBAAO,EAAC,WAAW,CAAC;IACpB,IAAA,mBAAU,GAAE;qCAEmC,oCAAwB;GAD3D,kBAAkB,CAU9B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Logger } from "@nestjs/common";
|
|
2
|
+
import { Response } from "express";
|
|
3
|
+
import { IGraphRequestPayload, IGraphResponsePayload, IGraphService } from "../interfaces";
|
|
4
|
+
import { BuilderRegistryService } from "../core/builder-registry.service";
|
|
5
|
+
export declare class GraphController {
|
|
6
|
+
protected readonly graphService: IGraphService;
|
|
7
|
+
private readonly builderRegistry;
|
|
8
|
+
protected readonly logger: Logger;
|
|
9
|
+
constructor(graphService: IGraphService, builderRegistry: BuilderRegistryService);
|
|
10
|
+
healthCheck(): Promise<{
|
|
11
|
+
status: string;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
}>;
|
|
14
|
+
getSupportedGraphTypes(): Promise<string[]>;
|
|
15
|
+
generateAnswer(payload: IGraphRequestPayload): Promise<IGraphResponsePayload>;
|
|
16
|
+
streamAnswer(payload: IGraphRequestPayload, res: Response): Promise<void>;
|
|
17
|
+
cancelGeneration(requestId: string): Promise<{
|
|
18
|
+
message: string;
|
|
19
|
+
}>;
|
|
20
|
+
getRegisteredGraphs(): Promise<{
|
|
21
|
+
total: number;
|
|
22
|
+
graphs: Array<{
|
|
23
|
+
graphType: string;
|
|
24
|
+
builderName: string;
|
|
25
|
+
}>;
|
|
26
|
+
}>;
|
|
27
|
+
getRegistryStats(): Promise<{
|
|
28
|
+
totalBuilders: number;
|
|
29
|
+
graphTypes: string[];
|
|
30
|
+
builderTypes: Record<string, number>;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var GraphController_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.GraphController = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
19
|
+
const builder_registry_service_1 = require("../core/builder-registry.service");
|
|
20
|
+
let GraphController = GraphController_1 = class GraphController {
|
|
21
|
+
constructor(graphService, builderRegistry) {
|
|
22
|
+
this.graphService = graphService;
|
|
23
|
+
this.builderRegistry = builderRegistry;
|
|
24
|
+
this.logger = new common_1.Logger(GraphController_1.name);
|
|
25
|
+
}
|
|
26
|
+
async healthCheck() {
|
|
27
|
+
try {
|
|
28
|
+
const isHealthy = await this.graphService.healthCheck();
|
|
29
|
+
return {
|
|
30
|
+
status: isHealthy ? "healthy" : "unhealthy",
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.logger.error(`Health check failed: ${error.message}`);
|
|
36
|
+
throw new common_1.HttpException("Service unhealthy", common_1.HttpStatus.SERVICE_UNAVAILABLE);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async getSupportedGraphTypes() {
|
|
40
|
+
return this.graphService.getSupportedGraphTypes();
|
|
41
|
+
}
|
|
42
|
+
async generateAnswer(payload) {
|
|
43
|
+
try {
|
|
44
|
+
return await this.graphService.generateAnswer(payload);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
this.logger.error(`Generation failed: ${error.message}`);
|
|
48
|
+
throw new common_1.HttpException(`Generation failed: ${error.message}`, common_1.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async streamAnswer(payload, res) {
|
|
52
|
+
var _a, _b, _c;
|
|
53
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
54
|
+
res.setHeader("Transfer-Encoding", "chunked");
|
|
55
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
56
|
+
res.setHeader("Connection", "keep-alive");
|
|
57
|
+
try {
|
|
58
|
+
this.logger.debug(`[CONTROLLER] Starting streamAnswer for requestId: ${payload.requestId}`);
|
|
59
|
+
const result = await this.graphService.streamAnswer(payload, (chunk) => {
|
|
60
|
+
res.write(`event: stream_event\n`);
|
|
61
|
+
res.write(`data: ${chunk}\n\n`);
|
|
62
|
+
});
|
|
63
|
+
this.logger.debug(`[CONTROLLER] Got final result: ${JSON.stringify(result)}...`);
|
|
64
|
+
this.logger.debug(`[CONTROLLER] Final result details:`, {
|
|
65
|
+
hasText: !!result.text,
|
|
66
|
+
textLength: ((_a = result.text) === null || _a === void 0 ? void 0 : _a.length) || 0,
|
|
67
|
+
attachmentsCount: ((_b = result.attachments) === null || _b === void 0 ? void 0 : _b.length) || 0,
|
|
68
|
+
reasoningChainsCount: ((_c = result.reasoningChains) === null || _c === void 0 ? void 0 : _c.length) || 0,
|
|
69
|
+
resultKeys: Object.keys(result || {}),
|
|
70
|
+
});
|
|
71
|
+
res.write(`event: final\n`);
|
|
72
|
+
res.write(`data: ${JSON.stringify(result)}\n\n`);
|
|
73
|
+
res.end();
|
|
74
|
+
this.logger.debug(`[CONTROLLER] Stream completed successfully`);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.logger.error(`[CONTROLLER] Streaming failed: ${error.message}`);
|
|
78
|
+
this.logger.error(`[CONTROLLER] Error stack: ${error.stack}`);
|
|
79
|
+
res.write(`event: error\n`);
|
|
80
|
+
res.write(`data: ${JSON.stringify({ message: error.message })}\n\n`);
|
|
81
|
+
res.end();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async cancelGeneration(requestId) {
|
|
85
|
+
try {
|
|
86
|
+
await this.graphService.cancelGeneration(requestId);
|
|
87
|
+
return { message: `Generation ${requestId} cancelled` };
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this.logger.error(`Cancellation failed: ${error.message}`);
|
|
91
|
+
throw new common_1.HttpException(`Cancellation failed: ${error.message}`, common_1.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async getRegisteredGraphs() {
|
|
95
|
+
const builders = this.builderRegistry.getBuilders();
|
|
96
|
+
return {
|
|
97
|
+
total: builders.length,
|
|
98
|
+
graphs: builders.map(builder => ({
|
|
99
|
+
graphType: builder.graphType,
|
|
100
|
+
builderName: builder.constructor.name,
|
|
101
|
+
})),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async getRegistryStats() {
|
|
105
|
+
const builders = this.builderRegistry.getBuilders();
|
|
106
|
+
const graphTypes = builders.map(b => b.graphType);
|
|
107
|
+
const builderTypes = {};
|
|
108
|
+
builders.forEach(builder => {
|
|
109
|
+
const name = builder.constructor.name;
|
|
110
|
+
builderTypes[name] = (builderTypes[name] || 0) + 1;
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
totalBuilders: builders.length,
|
|
114
|
+
graphTypes,
|
|
115
|
+
builderTypes,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
exports.GraphController = GraphController;
|
|
120
|
+
__decorate([
|
|
121
|
+
(0, common_1.Get)("health"),
|
|
122
|
+
(0, swagger_1.ApiOperation)({ summary: "Проверка состояния сервиса графов" }),
|
|
123
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Сервис доступен" }),
|
|
124
|
+
__metadata("design:type", Function),
|
|
125
|
+
__metadata("design:paramtypes", []),
|
|
126
|
+
__metadata("design:returntype", Promise)
|
|
127
|
+
], GraphController.prototype, "healthCheck", null);
|
|
128
|
+
__decorate([
|
|
129
|
+
(0, common_1.Get)("graph-types"),
|
|
130
|
+
(0, swagger_1.ApiOperation)({ summary: "Получить поддерживаемые типы графов" }),
|
|
131
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Список типов графов" }),
|
|
132
|
+
__metadata("design:type", Function),
|
|
133
|
+
__metadata("design:paramtypes", []),
|
|
134
|
+
__metadata("design:returntype", Promise)
|
|
135
|
+
], GraphController.prototype, "getSupportedGraphTypes", null);
|
|
136
|
+
__decorate([
|
|
137
|
+
(0, common_1.Post)("generate"),
|
|
138
|
+
(0, swagger_1.ApiOperation)({ summary: "Генерация ответа (без стриминга)" }),
|
|
139
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Ответ сгенерирован" }),
|
|
140
|
+
__param(0, (0, common_1.Body)()),
|
|
141
|
+
__metadata("design:type", Function),
|
|
142
|
+
__metadata("design:paramtypes", [Object]),
|
|
143
|
+
__metadata("design:returntype", Promise)
|
|
144
|
+
], GraphController.prototype, "generateAnswer", null);
|
|
145
|
+
__decorate([
|
|
146
|
+
(0, common_1.Post)("stream"),
|
|
147
|
+
(0, swagger_1.ApiOperation)({ summary: "Стриминг-генерация ответа" }),
|
|
148
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Стриминг ответа" }),
|
|
149
|
+
__param(0, (0, common_1.Body)()),
|
|
150
|
+
__param(1, (0, common_1.Res)()),
|
|
151
|
+
__metadata("design:type", Function),
|
|
152
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
153
|
+
__metadata("design:returntype", Promise)
|
|
154
|
+
], GraphController.prototype, "streamAnswer", null);
|
|
155
|
+
__decorate([
|
|
156
|
+
(0, common_1.Post)("cancel/:requestId"),
|
|
157
|
+
(0, swagger_1.ApiOperation)({ summary: "Отмена генерации" }),
|
|
158
|
+
(0, swagger_1.ApiParam)({ name: "requestId", description: "ID запроса для отмены" }),
|
|
159
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Генерация отменена" }),
|
|
160
|
+
__param(0, (0, common_1.Param)("requestId")),
|
|
161
|
+
__metadata("design:type", Function),
|
|
162
|
+
__metadata("design:paramtypes", [String]),
|
|
163
|
+
__metadata("design:returntype", Promise)
|
|
164
|
+
], GraphController.prototype, "cancelGeneration", null);
|
|
165
|
+
__decorate([
|
|
166
|
+
(0, common_1.Get)("registry"),
|
|
167
|
+
(0, swagger_1.ApiOperation)({ summary: "Получить все зарегистрированные графы" }),
|
|
168
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Список зарегистрированных графов" }),
|
|
169
|
+
__metadata("design:type", Function),
|
|
170
|
+
__metadata("design:paramtypes", []),
|
|
171
|
+
__metadata("design:returntype", Promise)
|
|
172
|
+
], GraphController.prototype, "getRegisteredGraphs", null);
|
|
173
|
+
__decorate([
|
|
174
|
+
(0, common_1.Get)("registry/stats"),
|
|
175
|
+
(0, swagger_1.ApiOperation)({ summary: "Статистика реестра графов" }),
|
|
176
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: "Статистика" }),
|
|
177
|
+
__metadata("design:type", Function),
|
|
178
|
+
__metadata("design:paramtypes", []),
|
|
179
|
+
__metadata("design:returntype", Promise)
|
|
180
|
+
], GraphController.prototype, "getRegistryStats", null);
|
|
181
|
+
exports.GraphController = GraphController = GraphController_1 = __decorate([
|
|
182
|
+
(0, swagger_1.ApiTags)("Graphs"),
|
|
183
|
+
(0, common_1.Controller)(),
|
|
184
|
+
__param(0, (0, common_1.Inject)("GRAPH_SERVICE")),
|
|
185
|
+
__metadata("design:paramtypes", [Object, builder_registry_service_1.BuilderRegistryService])
|
|
186
|
+
], GraphController);
|
|
187
|
+
//# sourceMappingURL=graph.controller.js.map
|