@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.
Files changed (191) hide show
  1. package/README.md +287 -0
  2. package/dist/api/callback-token.guard.d.ts +17 -0
  3. package/dist/api/callback-token.guard.js +80 -0
  4. package/dist/api/callback-token.guard.js.map +1 -0
  5. package/dist/api/callback.controller.d.ts +7 -0
  6. package/dist/api/callback.controller.js +44 -0
  7. package/dist/api/callback.controller.js.map +1 -0
  8. package/dist/api/graph.controller.d.ts +32 -0
  9. package/dist/api/graph.controller.js +187 -0
  10. package/dist/api/graph.controller.js.map +1 -0
  11. package/dist/api/ui-dispatch.controller.d.ts +34 -0
  12. package/dist/api/ui-dispatch.controller.js +178 -0
  13. package/dist/api/ui-dispatch.controller.js.map +1 -0
  14. package/dist/bootstrap.d.ts +4 -0
  15. package/dist/bootstrap.js +177 -0
  16. package/dist/bootstrap.js.map +1 -0
  17. package/dist/callbacks/callback-acl.service.d.ts +24 -0
  18. package/dist/callbacks/callback-acl.service.js +144 -0
  19. package/dist/callbacks/callback-acl.service.js.map +1 -0
  20. package/dist/callbacks/callback-auditor.service.d.ts +47 -0
  21. package/dist/callbacks/callback-auditor.service.js +286 -0
  22. package/dist/callbacks/callback-auditor.service.js.map +1 -0
  23. package/dist/callbacks/callback-metrics.service.d.ts +34 -0
  24. package/dist/callbacks/callback-metrics.service.js +216 -0
  25. package/dist/callbacks/callback-metrics.service.js.map +1 -0
  26. package/dist/callbacks/callback-patch.service.d.ts +13 -0
  27. package/dist/callbacks/callback-patch.service.js +51 -0
  28. package/dist/callbacks/callback-patch.service.js.map +1 -0
  29. package/dist/callbacks/callback-rate-limiter.d.ts +27 -0
  30. package/dist/callbacks/callback-rate-limiter.js +129 -0
  31. package/dist/callbacks/callback-rate-limiter.js.map +1 -0
  32. package/dist/callbacks/callback-registry.d.ts +7 -0
  33. package/dist/callbacks/callback-registry.js +29 -0
  34. package/dist/callbacks/callback-registry.js.map +1 -0
  35. package/dist/callbacks/callback-store.d.ts +19 -0
  36. package/dist/callbacks/callback-store.js +145 -0
  37. package/dist/callbacks/callback-store.js.map +1 -0
  38. package/dist/callbacks/example.callback.d.ts +2 -0
  39. package/dist/callbacks/example.callback.js +10 -0
  40. package/dist/callbacks/example.callback.js.map +1 -0
  41. package/dist/callbacks/idempotency-manager.d.ts +54 -0
  42. package/dist/callbacks/idempotency-manager.js +230 -0
  43. package/dist/callbacks/idempotency-manager.js.map +1 -0
  44. package/dist/callbacks/index.d.ts +13 -0
  45. package/dist/callbacks/index.js +30 -0
  46. package/dist/callbacks/index.js.map +1 -0
  47. package/dist/callbacks/smart-callback.router.d.ts +52 -0
  48. package/dist/callbacks/smart-callback.router.js +213 -0
  49. package/dist/callbacks/smart-callback.router.js.map +1 -0
  50. package/dist/callbacks/telegram-patch.handler.d.ts +6 -0
  51. package/dist/callbacks/telegram-patch.handler.js +24 -0
  52. package/dist/callbacks/telegram-patch.handler.js.map +1 -0
  53. package/dist/callbacks/universal-callback.service.d.ts +14 -0
  54. package/dist/callbacks/universal-callback.service.js +20 -0
  55. package/dist/callbacks/universal-callback.service.js.map +1 -0
  56. package/dist/callbacks/web-patch.handler.d.ts +6 -0
  57. package/dist/callbacks/web-patch.handler.js +24 -0
  58. package/dist/callbacks/web-patch.handler.js.map +1 -0
  59. package/dist/core/abstract-graph.builder.d.ts +128 -0
  60. package/dist/core/abstract-graph.builder.js +488 -0
  61. package/dist/core/abstract-graph.builder.js.map +1 -0
  62. package/dist/core/builder-registry.service.d.ts +6 -0
  63. package/dist/core/builder-registry.service.js +29 -0
  64. package/dist/core/builder-registry.service.js.map +1 -0
  65. package/dist/core/universal-graph.module.d.ts +10 -0
  66. package/dist/core/universal-graph.module.js +294 -0
  67. package/dist/core/universal-graph.module.js.map +1 -0
  68. package/dist/decorators/callback.decorators.d.ts +21 -0
  69. package/dist/decorators/callback.decorators.js +73 -0
  70. package/dist/decorators/callback.decorators.js.map +1 -0
  71. package/dist/endpoint-registry/endpoint.decorators.d.ts +35 -0
  72. package/dist/endpoint-registry/endpoint.decorators.js +115 -0
  73. package/dist/endpoint-registry/endpoint.decorators.js.map +1 -0
  74. package/dist/endpoint-registry/endpoint.registry.d.ts +44 -0
  75. package/dist/endpoint-registry/endpoint.registry.js +90 -0
  76. package/dist/endpoint-registry/endpoint.registry.js.map +1 -0
  77. package/dist/endpoint-registry/index.d.ts +3 -0
  78. package/dist/endpoint-registry/index.js +20 -0
  79. package/dist/endpoint-registry/index.js.map +1 -0
  80. package/dist/endpoint-registry/ui-endpoints.discovery.d.ts +11 -0
  81. package/dist/endpoint-registry/ui-endpoints.discovery.js +72 -0
  82. package/dist/endpoint-registry/ui-endpoints.discovery.js.map +1 -0
  83. package/dist/engine/api-call-tracer.utils.d.ts +8 -0
  84. package/dist/engine/api-call-tracer.utils.js +184 -0
  85. package/dist/engine/api-call-tracer.utils.js.map +1 -0
  86. package/dist/engine/event-processor.utils.d.ts +49 -0
  87. package/dist/engine/event-processor.utils.js +314 -0
  88. package/dist/engine/event-processor.utils.js.map +1 -0
  89. package/dist/engine/graph-engine.factory.d.ts +12 -0
  90. package/dist/engine/graph-engine.factory.js +43 -0
  91. package/dist/engine/graph-engine.factory.js.map +1 -0
  92. package/dist/engine/langgraph-engine.d.ts +14 -0
  93. package/dist/engine/langgraph-engine.js +261 -0
  94. package/dist/engine/langgraph-engine.js.map +1 -0
  95. package/dist/index.d.ts +27 -0
  96. package/dist/index.js +48 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/interfaces/callback.interface.d.ts +46 -0
  99. package/dist/interfaces/callback.interface.js +3 -0
  100. package/dist/interfaces/callback.interface.js.map +1 -0
  101. package/dist/interfaces/graph-registry.interface.d.ts +8 -0
  102. package/dist/interfaces/graph-registry.interface.js +3 -0
  103. package/dist/interfaces/graph-registry.interface.js.map +1 -0
  104. package/dist/interfaces/graph-service.interface.d.ts +43 -0
  105. package/dist/interfaces/graph-service.interface.js +9 -0
  106. package/dist/interfaces/graph-service.interface.js.map +1 -0
  107. package/dist/interfaces/index.d.ts +3 -0
  108. package/dist/interfaces/index.js +20 -0
  109. package/dist/interfaces/index.js.map +1 -0
  110. package/dist/llm/index.d.ts +6 -0
  111. package/dist/llm/index.js +23 -0
  112. package/dist/llm/index.js.map +1 -0
  113. package/dist/llm/llm.initializer.d.ts +14 -0
  114. package/dist/llm/llm.initializer.js +167 -0
  115. package/dist/llm/llm.initializer.js.map +1 -0
  116. package/dist/llm/llm.interface.d.ts +6 -0
  117. package/dist/llm/llm.interface.js +3 -0
  118. package/dist/llm/llm.interface.js.map +1 -0
  119. package/dist/llm/llm.types.d.ts +32 -0
  120. package/dist/llm/llm.types.js +3 -0
  121. package/dist/llm/llm.types.js.map +1 -0
  122. package/dist/llm/model.initializer.d.ts +45 -0
  123. package/dist/llm/model.initializer.js +630 -0
  124. package/dist/llm/model.initializer.js.map +1 -0
  125. package/dist/llm/model.interface.d.ts +38 -0
  126. package/dist/llm/model.interface.js +4 -0
  127. package/dist/llm/model.interface.js.map +1 -0
  128. package/dist/llm/rerankers/voyageai-rerank.d.ts +17 -0
  129. package/dist/llm/rerankers/voyageai-rerank.js +56 -0
  130. package/dist/llm/rerankers/voyageai-rerank.js.map +1 -0
  131. package/dist/retriever/database-factory.d.ts +15 -0
  132. package/dist/retriever/database-factory.js +83 -0
  133. package/dist/retriever/database-factory.js.map +1 -0
  134. package/dist/retriever/index.d.ts +2 -0
  135. package/dist/retriever/index.js +19 -0
  136. package/dist/retriever/index.js.map +1 -0
  137. package/dist/retriever/retriever.client.d.ts +28 -0
  138. package/dist/retriever/retriever.client.js +97 -0
  139. package/dist/retriever/retriever.client.js.map +1 -0
  140. package/dist/retriever/retriever.service.d.ts +25 -0
  141. package/dist/retriever/retriever.service.js +265 -0
  142. package/dist/retriever/retriever.service.js.map +1 -0
  143. package/dist/retriever/types.d.ts +22 -0
  144. package/dist/retriever/types.js +3 -0
  145. package/dist/retriever/types.js.map +1 -0
  146. package/dist/schemas/graph-manifest.schema.d.ts +134 -0
  147. package/dist/schemas/graph-manifest.schema.js +180 -0
  148. package/dist/schemas/graph-manifest.schema.js.map +1 -0
  149. package/dist/schemas/index.d.ts +1 -0
  150. package/dist/schemas/index.js +18 -0
  151. package/dist/schemas/index.js.map +1 -0
  152. package/dist/shared-types/index.d.ts +199 -0
  153. package/dist/shared-types/index.js +58 -0
  154. package/dist/shared-types/index.js.map +1 -0
  155. package/dist/tools/index.d.ts +3 -0
  156. package/dist/tools/index.js +20 -0
  157. package/dist/tools/index.js.map +1 -0
  158. package/dist/tools/mcp-converter.d.ts +15 -0
  159. package/dist/tools/mcp-converter.js +133 -0
  160. package/dist/tools/mcp-converter.js.map +1 -0
  161. package/dist/tools/mcp-tool-filter.d.ts +11 -0
  162. package/dist/tools/mcp-tool-filter.js +123 -0
  163. package/dist/tools/mcp-tool-filter.js.map +1 -0
  164. package/dist/tools/mcp.interfaces.d.ts +19 -0
  165. package/dist/tools/mcp.interfaces.js +3 -0
  166. package/dist/tools/mcp.interfaces.js.map +1 -0
  167. package/dist/types/graph-types.d.ts +82 -0
  168. package/dist/types/graph-types.js +6 -0
  169. package/dist/types/graph-types.js.map +1 -0
  170. package/dist/utils/error.utils.d.ts +18 -0
  171. package/dist/utils/error.utils.js +78 -0
  172. package/dist/utils/error.utils.js.map +1 -0
  173. package/dist/utils/graph-type.utils.d.ts +14 -0
  174. package/dist/utils/graph-type.utils.js +71 -0
  175. package/dist/utils/graph-type.utils.js.map +1 -0
  176. package/dist/utils/index.d.ts +1 -0
  177. package/dist/utils/index.js +18 -0
  178. package/dist/utils/index.js.map +1 -0
  179. package/dist/utils/usage-recorder.d.ts +23 -0
  180. package/dist/utils/usage-recorder.js +29 -0
  181. package/dist/utils/usage-recorder.js.map +1 -0
  182. package/dist/versioning/index.d.ts +2 -0
  183. package/dist/versioning/index.js +19 -0
  184. package/dist/versioning/index.js.map +1 -0
  185. package/dist/versioning/versioned-graph.service.d.ts +16 -0
  186. package/dist/versioning/versioned-graph.service.js +132 -0
  187. package/dist/versioning/versioned-graph.service.js.map +1 -0
  188. package/dist/versioning/versioning.types.d.ts +21 -0
  189. package/dist/versioning/versioning.types.js +3 -0
  190. package/dist/versioning/versioning.types.js.map +1 -0
  191. 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