@mgvdev/nestjs-ai 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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +655 -0
  3. package/dist/ai-module-options.interface-B5X4AFLC.d.cts +192 -0
  4. package/dist/ai-module-options.interface-Ca6y_MY2.d.ts +192 -0
  5. package/dist/conversation-store.interface-CtQY-qcc.d.cts +30 -0
  6. package/dist/conversation-store.interface-CtQY-qcc.d.ts +30 -0
  7. package/dist/index.cjs +3209 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.cts +1441 -0
  10. package/dist/index.d.ts +1441 -0
  11. package/dist/index.js +3163 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/stream-to-socket-fJphU0WN.d.cts +47 -0
  14. package/dist/stream-to-socket-fJphU0WN.d.ts +47 -0
  15. package/dist/testing.cjs +2395 -0
  16. package/dist/testing.cjs.map +1 -0
  17. package/dist/testing.d.cts +46 -0
  18. package/dist/testing.d.ts +46 -0
  19. package/dist/testing.js +2391 -0
  20. package/dist/testing.js.map +1 -0
  21. package/dist/typeorm.cjs +115 -0
  22. package/dist/typeorm.cjs.map +1 -0
  23. package/dist/typeorm.d.cts +44 -0
  24. package/dist/typeorm.d.ts +44 -0
  25. package/dist/typeorm.js +113 -0
  26. package/dist/typeorm.js.map +1 -0
  27. package/dist/websocket.cjs +154 -0
  28. package/dist/websocket.cjs.map +1 -0
  29. package/dist/websocket.d.cts +25 -0
  30. package/dist/websocket.d.ts +25 -0
  31. package/dist/websocket.js +152 -0
  32. package/dist/websocket.js.map +1 -0
  33. package/documentation/README.md +44 -0
  34. package/documentation/agents-and-tools.md +102 -0
  35. package/documentation/api-reference.md +117 -0
  36. package/documentation/configuration.md +87 -0
  37. package/documentation/content-safety.md +51 -0
  38. package/documentation/embeddings-and-rag.md +105 -0
  39. package/documentation/evals-and-testing.md +56 -0
  40. package/documentation/getting-started.md +96 -0
  41. package/documentation/guardrails-events-telemetry.md +72 -0
  42. package/documentation/jobs-and-realtime.md +69 -0
  43. package/documentation/memory.md +101 -0
  44. package/documentation/multimodal.md +49 -0
  45. package/documentation/orchestration-and-mcp.md +68 -0
  46. package/documentation/prompts.md +51 -0
  47. package/documentation/reliability.md +90 -0
  48. package/documentation/structured-output-and-streaming.md +81 -0
  49. package/package.json +146 -0
  50. package/skill/nestjs-ai/SKILL.md +154 -0
@@ -0,0 +1,2395 @@
1
+ 'use strict';
2
+
3
+ var test = require('ai/test');
4
+ var testing = require('@nestjs/testing');
5
+ var common = require('@nestjs/common');
6
+ var core = require('@nestjs/core');
7
+ var ai = require('ai');
8
+ var zod = require('zod');
9
+ require('reflect-metadata');
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ var ZERO_USAGE = {
14
+ inputTokens: 0,
15
+ outputTokens: 0,
16
+ totalTokens: 0
17
+ };
18
+ function createMockModel(replies) {
19
+ const texts = Array.isArray(replies) ? replies : [
20
+ replies
21
+ ];
22
+ const results = texts.map((text) => ({
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text
27
+ }
28
+ ],
29
+ finishReason: "stop",
30
+ usage: ZERO_USAGE,
31
+ warnings: []
32
+ }));
33
+ let call = 0;
34
+ return new test.MockLanguageModelV3({
35
+ doGenerate: /* @__PURE__ */ __name(async () => results[Math.min(call++, results.length - 1)], "doGenerate")
36
+ });
37
+ }
38
+ __name(createMockModel, "createMockModel");
39
+ function createEmbeddingMock(embed2) {
40
+ return new test.MockEmbeddingModelV3({
41
+ doEmbed: /* @__PURE__ */ __name(async ({ values }) => ({
42
+ embeddings: values.map(embed2),
43
+ usage: {
44
+ tokens: values.length
45
+ }
46
+ }), "doEmbed")
47
+ });
48
+ }
49
+ __name(createEmbeddingMock, "createEmbeddingMock");
50
+
51
+ // src/ai.constants.ts
52
+ var AI_MODULE_OPTIONS = /* @__PURE__ */ Symbol("AI_MODULE_OPTIONS");
53
+ var CONVERSATION_STORE = /* @__PURE__ */ Symbol("CONVERSATION_STORE");
54
+ var VECTOR_STORE = /* @__PURE__ */ Symbol("VECTOR_STORE");
55
+ var AI_CACHE = /* @__PURE__ */ Symbol("AI_CACHE");
56
+ var APPROVAL_GATE = /* @__PURE__ */ Symbol("APPROVAL_GATE");
57
+ var RATE_LIMITER = /* @__PURE__ */ Symbol("RATE_LIMITER");
58
+ var RERANKER = /* @__PURE__ */ Symbol("RERANKER");
59
+ var TOOL_METADATA = /* @__PURE__ */ Symbol("nestjs-ai:tool");
60
+ var AGENT_METADATA = /* @__PURE__ */ Symbol("nestjs-ai:agent");
61
+ var GUARDRAIL_METADATA = /* @__PURE__ */ Symbol("nestjs-ai:guardrail");
62
+ var DEFAULT_MAX_STEPS = 5;
63
+
64
+ // src/resilience/fallback-model.ts
65
+ function createFallbackModel(models, options = {}) {
66
+ if (models.length === 0) {
67
+ throw new Error("createFallbackModel requires at least one model.");
68
+ }
69
+ const primary = models[0];
70
+ const shouldRetry = options.shouldRetry ?? (() => true);
71
+ async function attempt(call) {
72
+ let lastError;
73
+ for (let i = 0; i < models.length; i++) {
74
+ try {
75
+ return await call(models[i]);
76
+ } catch (error) {
77
+ lastError = error;
78
+ const isLast = i === models.length - 1;
79
+ if (isLast || !shouldRetry(error)) {
80
+ throw error;
81
+ }
82
+ }
83
+ }
84
+ throw lastError;
85
+ }
86
+ __name(attempt, "attempt");
87
+ return {
88
+ specificationVersion: "v3",
89
+ provider: options.provider ?? `fallback(${primary.provider})`,
90
+ modelId: primary.modelId,
91
+ get supportedUrls() {
92
+ return primary.supportedUrls;
93
+ },
94
+ doGenerate: /* @__PURE__ */ __name((callOptions) => attempt((model) => model.doGenerate(callOptions)), "doGenerate"),
95
+ doStream: /* @__PURE__ */ __name((callOptions) => attempt((model) => model.doStream(callOptions)), "doStream")
96
+ };
97
+ }
98
+ __name(createFallbackModel, "createFallbackModel");
99
+
100
+ // src/cache/cache-middleware.ts
101
+ function createCacheMiddleware(cache, options = {}) {
102
+ return {
103
+ async wrapGenerate({ doGenerate, params, model }) {
104
+ const key = cacheKey(model.modelId, params);
105
+ const cached = await cache.get(key);
106
+ if (cached !== void 0) {
107
+ return cached;
108
+ }
109
+ const result = await doGenerate();
110
+ await cache.set(key, result, options.ttlMs);
111
+ return result;
112
+ }
113
+ };
114
+ }
115
+ __name(createCacheMiddleware, "createCacheMiddleware");
116
+ function cacheKey(modelId, params) {
117
+ return `${modelId}:${stableStringify(params)}`;
118
+ }
119
+ __name(cacheKey, "cacheKey");
120
+ function stableStringify(value) {
121
+ return JSON.stringify(value, (_key, val) => {
122
+ if (val && typeof val === "object" && !Array.isArray(val)) {
123
+ return Object.keys(val).sort().reduce((acc, k) => {
124
+ acc[k] = val[k];
125
+ return acc;
126
+ }, {});
127
+ }
128
+ return val;
129
+ });
130
+ }
131
+ __name(stableStringify, "stableStringify");
132
+
133
+ // src/core/provider-registry.ts
134
+ function _ts_decorate(decorators, target, key, desc) {
135
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
136
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
137
+ 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;
138
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
139
+ }
140
+ __name(_ts_decorate, "_ts_decorate");
141
+ function _ts_metadata(k, v) {
142
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
143
+ }
144
+ __name(_ts_metadata, "_ts_metadata");
145
+ function _ts_param(paramIndex, decorator) {
146
+ return function(target, key) {
147
+ decorator(target, key, paramIndex);
148
+ };
149
+ }
150
+ __name(_ts_param, "_ts_param");
151
+ var ProviderRegistry = class {
152
+ static {
153
+ __name(this, "ProviderRegistry");
154
+ }
155
+ options;
156
+ cache;
157
+ providers = /* @__PURE__ */ new Map();
158
+ constructor(options, cache) {
159
+ this.options = options;
160
+ this.cache = cache;
161
+ }
162
+ /** Wraps a model with the cache middleware when a cache is configured. */
163
+ applyCache(model) {
164
+ if (!this.cache || typeof model === "string") {
165
+ return model;
166
+ }
167
+ return ai.wrapLanguageModel({
168
+ model,
169
+ middleware: createCacheMiddleware(this.cache, {
170
+ ttlMs: this.options.cacheTtlMs
171
+ })
172
+ });
173
+ }
174
+ async onModuleInit() {
175
+ const configured = this.options.providers ?? {};
176
+ for (const name of Object.keys(configured)) {
177
+ const config = configured[name];
178
+ if (config) {
179
+ await this.initProvider(name, config);
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Resolves a language model. Accepts a `LanguageModel` instance (returned
185
+ * as-is), a `"provider:model"` string, a bare `"model"` string (using the
186
+ * default provider), or `undefined` (using `defaultModel`).
187
+ */
188
+ getLanguageModel(model) {
189
+ const chain = model ?? this.options.defaultModel;
190
+ if (Array.isArray(chain)) {
191
+ if (chain.length === 0) {
192
+ throw new Error("An empty model array was provided.");
193
+ }
194
+ if (chain.length === 1) {
195
+ return this.getLanguageModel(chain[0]);
196
+ }
197
+ const resolved = chain.map((m) => this.resolveSingle(m));
198
+ return this.applyCache(createFallbackModel(resolved));
199
+ }
200
+ return this.applyCache(this.resolveSingle(chain));
201
+ }
202
+ /** Resolves a single (non-array) model reference without cache wrapping. */
203
+ resolveSingle(model) {
204
+ if (model && typeof model !== "string") {
205
+ return model;
206
+ }
207
+ const { provider, modelId } = this.resolve(model, void 0);
208
+ return provider.languageModel(modelId);
209
+ }
210
+ /**
211
+ * Resolves an embedding model from a `"provider:model"` string, a bare model
212
+ * string, an `EmbeddingModel` instance, or `undefined` (using
213
+ * `defaultEmbeddingModel`).
214
+ */
215
+ getEmbeddingModel(model) {
216
+ if (model && typeof model !== "string") {
217
+ return model;
218
+ }
219
+ const { name, provider, modelId } = this.resolve(model, this.options.defaultEmbeddingModel);
220
+ if (typeof provider.textEmbeddingModel !== "function") {
221
+ throw new Error(`Provider "${name}" does not support embeddings. Configure a provider with embedding support (e.g. openai or google).`);
222
+ }
223
+ return provider.textEmbeddingModel(modelId);
224
+ }
225
+ /** Resolves an image-generation model (default `defaultImageModel`). */
226
+ getImageModel(model) {
227
+ if (model && typeof model !== "string") {
228
+ return model;
229
+ }
230
+ return this.resolveMultimodal(model, this.options.defaultImageModel, [
231
+ "imageModel",
232
+ "image"
233
+ ], "image generation");
234
+ }
235
+ /** Resolves a reranking model (default `rerankingModel` option). */
236
+ getRerankingModel(model) {
237
+ if (model && typeof model !== "string") {
238
+ return model;
239
+ }
240
+ return this.resolveMultimodal(model, this.options.rerankingModel, [
241
+ "rerankingModel",
242
+ "reranking"
243
+ ], "reranking");
244
+ }
245
+ /** Resolves a speech (text-to-speech) model (default `defaultSpeechModel`). */
246
+ getSpeechModel(model) {
247
+ if (model && typeof model !== "string") {
248
+ return model;
249
+ }
250
+ return this.resolveMultimodal(model, this.options.defaultSpeechModel, [
251
+ "speechModel",
252
+ "speech"
253
+ ], "speech");
254
+ }
255
+ /** Resolves a transcription (speech-to-text) model. */
256
+ getTranscriptionModel(model) {
257
+ if (model && typeof model !== "string") {
258
+ return model;
259
+ }
260
+ return this.resolveMultimodal(model, this.options.defaultTranscriptionModel, [
261
+ "transcriptionModel",
262
+ "transcription"
263
+ ], "transcription");
264
+ }
265
+ /**
266
+ * Shared resolution for multimodal models: resolves the provider, then calls
267
+ * the first available factory method (standard name, then shorthand).
268
+ */
269
+ resolveMultimodal(model, fallback, methods, capability) {
270
+ const { name, provider, modelId } = this.resolve(model, fallback);
271
+ for (const method of methods) {
272
+ const fn = provider[method];
273
+ if (typeof fn === "function") {
274
+ return fn.call(provider, modelId);
275
+ }
276
+ }
277
+ throw new Error(`Provider "${name}" does not support ${capability}. Configure a provider that does (e.g. openai).`);
278
+ }
279
+ resolve(model, fallback) {
280
+ const raw = model ?? fallback;
281
+ if (!raw) {
282
+ throw new Error("No model specified and no default model configured. Pass a model id or set `defaultModel` in AiModule options.");
283
+ }
284
+ const name = this.parseProviderName(raw);
285
+ const modelId = this.parseModelId(raw);
286
+ const provider = this.providers.get(name);
287
+ if (!provider) {
288
+ throw new Error(`Provider "${name}" is not configured. Add it to AiModule \`providers\` options and install \`@ai-sdk/${name}\`.`);
289
+ }
290
+ return {
291
+ name,
292
+ provider,
293
+ modelId
294
+ };
295
+ }
296
+ parseProviderName(raw) {
297
+ const sep = raw.indexOf(":");
298
+ if (sep !== -1) {
299
+ return raw.slice(0, sep);
300
+ }
301
+ if (this.providers.size === 1) {
302
+ return this.providers.keys().next().value;
303
+ }
304
+ const def = this.options.defaultModel;
305
+ if (def && def.includes(":")) {
306
+ return def.slice(0, def.indexOf(":"));
307
+ }
308
+ throw new Error(`Cannot infer provider for model "${raw}". Prefix it as "provider:model" (e.g. "openai:${raw}").`);
309
+ }
310
+ parseModelId(raw) {
311
+ const sep = raw.indexOf(":");
312
+ return sep !== -1 ? raw.slice(sep + 1) : raw;
313
+ }
314
+ async initProvider(name, config) {
315
+ const settings = {
316
+ apiKey: config.apiKey,
317
+ baseURL: config.baseURL,
318
+ headers: config.headers
319
+ };
320
+ try {
321
+ switch (name) {
322
+ case "openai": {
323
+ const { createOpenAI } = await import('@ai-sdk/openai');
324
+ this.providers.set(name, createOpenAI(settings));
325
+ break;
326
+ }
327
+ case "anthropic": {
328
+ const { createAnthropic } = await import('@ai-sdk/anthropic');
329
+ this.providers.set(name, createAnthropic(settings));
330
+ break;
331
+ }
332
+ case "google": {
333
+ const { createGoogleGenerativeAI } = await import('@ai-sdk/google');
334
+ this.providers.set(name, createGoogleGenerativeAI(settings));
335
+ break;
336
+ }
337
+ default: {
338
+ throw new Error(`Unknown provider "${name}".`);
339
+ }
340
+ }
341
+ } catch (error) {
342
+ if (error instanceof Error && /Cannot find|find module/i.test(error.message)) {
343
+ throw new Error(`Provider "${name}" is configured but the package "@ai-sdk/${name}" is not installed. Run \`npm install @ai-sdk/${name}\`.`);
344
+ }
345
+ throw error;
346
+ }
347
+ }
348
+ };
349
+ ProviderRegistry = _ts_decorate([
350
+ common.Injectable(),
351
+ _ts_param(0, common.Inject(AI_MODULE_OPTIONS)),
352
+ _ts_param(1, common.Optional()),
353
+ _ts_param(1, common.Inject(AI_CACHE)),
354
+ _ts_metadata("design:type", Function),
355
+ _ts_metadata("design:paramtypes", [
356
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions,
357
+ typeof AiCache === "undefined" ? Object : AiCache
358
+ ])
359
+ ], ProviderRegistry);
360
+ function _ts_decorate2(decorators, target, key, desc) {
361
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
362
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
363
+ 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;
364
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
365
+ }
366
+ __name(_ts_decorate2, "_ts_decorate");
367
+ function _ts_metadata2(k, v) {
368
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
369
+ }
370
+ __name(_ts_metadata2, "_ts_metadata");
371
+ function _ts_param2(paramIndex, decorator) {
372
+ return function(target, key) {
373
+ decorator(target, key, paramIndex);
374
+ };
375
+ }
376
+ __name(_ts_param2, "_ts_param");
377
+ var EVENT_EMITTER = /* @__PURE__ */ Symbol("AI_EVENT_EMITTER");
378
+ var AiEventEmitter = class {
379
+ static {
380
+ __name(this, "AiEventEmitter");
381
+ }
382
+ emitter;
383
+ constructor(emitter) {
384
+ this.emitter = emitter;
385
+ }
386
+ emit(event, payload) {
387
+ this.emitter?.emit(event, payload);
388
+ }
389
+ /** Whether an underlying emitter is wired up. */
390
+ get enabled() {
391
+ return this.emitter != null;
392
+ }
393
+ };
394
+ AiEventEmitter = _ts_decorate2([
395
+ common.Injectable(),
396
+ _ts_param2(0, common.Optional()),
397
+ _ts_param2(0, common.Inject(EVENT_EMITTER)),
398
+ _ts_metadata2("design:type", Function),
399
+ _ts_metadata2("design:paramtypes", [
400
+ Object
401
+ ])
402
+ ], AiEventEmitter);
403
+
404
+ // src/observability/ai-events.ts
405
+ var AI_EVENTS = {
406
+ agentRunStart: "ai.agent.run.start",
407
+ agentRunFinish: "ai.agent.run.finish",
408
+ agentRunError: "ai.agent.run.error",
409
+ toolCall: "ai.tool.call",
410
+ toolResult: "ai.tool.result",
411
+ streamFinish: "ai.stream.finish",
412
+ usage: "ai.usage"
413
+ };
414
+ function _ts_decorate3(decorators, target, key, desc) {
415
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
416
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
417
+ 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;
418
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
419
+ }
420
+ __name(_ts_decorate3, "_ts_decorate");
421
+ function _ts_metadata3(k, v) {
422
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
423
+ }
424
+ __name(_ts_metadata3, "_ts_metadata");
425
+ var GuardrailRegistry = class {
426
+ static {
427
+ __name(this, "GuardrailRegistry");
428
+ }
429
+ discovery;
430
+ guardrails = [];
431
+ constructor(discovery) {
432
+ this.discovery = discovery;
433
+ }
434
+ onModuleInit() {
435
+ for (const wrapper of this.discovery.getProviders()) {
436
+ const instance = wrapper.instance;
437
+ const ctor = instance?.constructor;
438
+ if (instance && ctor && Reflect.getMetadata(GUARDRAIL_METADATA, ctor) === true) {
439
+ this.guardrails.push(instance);
440
+ }
441
+ }
442
+ }
443
+ get count() {
444
+ return this.guardrails.length;
445
+ }
446
+ async runBeforeRun(ctx) {
447
+ for (const guardrail of this.guardrails) {
448
+ await guardrail.beforeRun?.(ctx);
449
+ }
450
+ }
451
+ async runAfterRun(ctx, result) {
452
+ for (const guardrail of this.guardrails) {
453
+ await guardrail.afterRun?.(ctx, result);
454
+ }
455
+ }
456
+ async runOnToolCall(tool3, args) {
457
+ for (const guardrail of this.guardrails) {
458
+ await guardrail.onToolCall?.(tool3, args);
459
+ }
460
+ }
461
+ };
462
+ GuardrailRegistry = _ts_decorate3([
463
+ common.Injectable(),
464
+ _ts_metadata3("design:type", Function),
465
+ _ts_metadata3("design:paramtypes", [
466
+ typeof core.DiscoveryService === "undefined" ? Object : core.DiscoveryService
467
+ ])
468
+ ], GuardrailRegistry);
469
+ function _ts_decorate4(decorators, target, key, desc) {
470
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
471
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
472
+ 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;
473
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
474
+ }
475
+ __name(_ts_decorate4, "_ts_decorate");
476
+ function _ts_metadata4(k, v) {
477
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
478
+ }
479
+ __name(_ts_metadata4, "_ts_metadata");
480
+ var AgentRegistry = class {
481
+ static {
482
+ __name(this, "AgentRegistry");
483
+ }
484
+ discovery;
485
+ agents = /* @__PURE__ */ new Map();
486
+ constructor(discovery) {
487
+ this.discovery = discovery;
488
+ }
489
+ onModuleInit() {
490
+ for (const wrapper of this.discovery.getProviders()) {
491
+ const instance = wrapper.instance;
492
+ const ctor = instance?.constructor;
493
+ if (instance && ctor && Reflect.getMetadata(AGENT_METADATA, ctor)) {
494
+ this.agents.set(ctor.name, {
495
+ name: ctor.name,
496
+ instance,
497
+ target: ctor
498
+ });
499
+ }
500
+ }
501
+ }
502
+ /** Returns an agent instance by class name. */
503
+ get(name) {
504
+ return this.agents.get(name)?.instance;
505
+ }
506
+ /** Returns an agent instance by its class. */
507
+ getByClass(target) {
508
+ return this.agents.get(target.name)?.instance;
509
+ }
510
+ /** All discovered agents. */
511
+ all() {
512
+ return [
513
+ ...this.agents.values()
514
+ ];
515
+ }
516
+ };
517
+ AgentRegistry = _ts_decorate4([
518
+ common.Injectable(),
519
+ _ts_metadata4("design:type", Function),
520
+ _ts_metadata4("design:paramtypes", [
521
+ typeof core.DiscoveryService === "undefined" ? Object : core.DiscoveryService
522
+ ])
523
+ ], AgentRegistry);
524
+ function createAgentTool(agent, options = {}) {
525
+ const schema = options.inputSchema ?? zod.z.object({
526
+ input: zod.z.string().describe("The task or question for the agent")
527
+ });
528
+ return ai.tool({
529
+ description: options.description ?? `Delegate the task to the ${options.name ?? "sub"} agent.`,
530
+ inputSchema: schema,
531
+ execute: /* @__PURE__ */ __name(async (args) => {
532
+ const input = typeof args === "string" ? args : args?.input ?? JSON.stringify(args);
533
+ const result = await agent.run(input);
534
+ return result.text;
535
+ }, "execute")
536
+ });
537
+ }
538
+ __name(createAgentTool, "createAgentTool");
539
+
540
+ // src/approval/approval-gate.interface.ts
541
+ var ToolApprovalDeniedError = class extends Error {
542
+ static {
543
+ __name(this, "ToolApprovalDeniedError");
544
+ }
545
+ tool;
546
+ constructor(tool3) {
547
+ super(`Tool "${tool3}" was denied by the approval gate.`), this.tool = tool3;
548
+ this.name = "ToolApprovalDeniedError";
549
+ }
550
+ };
551
+
552
+ // src/tools/tool.registry.ts
553
+ function _ts_decorate5(decorators, target, key, desc) {
554
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
555
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
556
+ 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;
557
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
558
+ }
559
+ __name(_ts_decorate5, "_ts_decorate");
560
+ function _ts_metadata5(k, v) {
561
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
562
+ }
563
+ __name(_ts_metadata5, "_ts_metadata");
564
+ function _ts_param3(paramIndex, decorator) {
565
+ return function(target, key) {
566
+ decorator(target, key, paramIndex);
567
+ };
568
+ }
569
+ __name(_ts_param3, "_ts_param");
570
+ var ToolRegistry = class {
571
+ static {
572
+ __name(this, "ToolRegistry");
573
+ }
574
+ discovery;
575
+ scanner;
576
+ reflector;
577
+ events;
578
+ guardrails;
579
+ approvalGate;
580
+ agentRegistry;
581
+ tools = /* @__PURE__ */ new Map();
582
+ constructor(discovery, scanner, reflector, events, guardrails, approvalGate, agentRegistry) {
583
+ this.discovery = discovery;
584
+ this.scanner = scanner;
585
+ this.reflector = reflector;
586
+ this.events = events;
587
+ this.guardrails = guardrails;
588
+ this.approvalGate = approvalGate;
589
+ this.agentRegistry = agentRegistry;
590
+ }
591
+ onModuleInit() {
592
+ for (const wrapper of this.discovery.getProviders()) {
593
+ const instance = wrapper.instance;
594
+ if (!instance || typeof instance !== "object") {
595
+ continue;
596
+ }
597
+ const prototype = Object.getPrototypeOf(instance);
598
+ if (!prototype) {
599
+ continue;
600
+ }
601
+ for (const methodName of this.scanner.getAllMethodNames(prototype)) {
602
+ const methodRef = instance[methodName];
603
+ const metadata = this.reflector.get(TOOL_METADATA, methodRef);
604
+ if (!metadata) {
605
+ continue;
606
+ }
607
+ this.register(instance, methodName, metadata);
608
+ }
609
+ }
610
+ }
611
+ register(instance, methodName, metadata) {
612
+ const name = metadata.name ?? methodName;
613
+ if (this.tools.has(name)) {
614
+ throw new Error(`Duplicate AI tool name "${name}". Tool names must be unique across all providers (declared on ${instance.constructor?.name}).`);
615
+ }
616
+ const built = ai.tool({
617
+ description: metadata.description,
618
+ inputSchema: metadata.schema,
619
+ execute: /* @__PURE__ */ __name(async (args, opts) => {
620
+ if (metadata.requiresApproval && this.approvalGate) {
621
+ const approved = await this.approvalGate.requestApproval({
622
+ tool: name,
623
+ args
624
+ });
625
+ if (!approved) {
626
+ throw new ToolApprovalDeniedError(name);
627
+ }
628
+ }
629
+ await this.guardrails?.runOnToolCall(name, args);
630
+ this.events?.emit(AI_EVENTS.toolCall, {
631
+ tool: name,
632
+ args
633
+ });
634
+ const result = await instance[methodName](args, opts);
635
+ this.events?.emit(AI_EVENTS.toolResult, {
636
+ tool: name,
637
+ args,
638
+ result
639
+ });
640
+ return result;
641
+ }, "execute")
642
+ });
643
+ this.tools.set(name, {
644
+ name,
645
+ tool: built,
646
+ target: instance.constructor
647
+ });
648
+ }
649
+ /** Returns the tool registered under `name`, if any. */
650
+ getByName(name) {
651
+ return this.tools.get(name);
652
+ }
653
+ /** Returns every tool declared by the given provider class. */
654
+ getForClass(target) {
655
+ return [
656
+ ...this.tools.values()
657
+ ].filter((entry) => entry.target === target);
658
+ }
659
+ /** Returns all discovered tools. */
660
+ getAll() {
661
+ return [
662
+ ...this.tools.values()
663
+ ];
664
+ }
665
+ /**
666
+ * Builds the `ToolSet` passed to `generateText`/`streamText` from a list of
667
+ * tool references (provider classes and/or tool names). Passing no refs
668
+ * returns every discovered tool.
669
+ */
670
+ buildToolSet(refs) {
671
+ const entries = refs && refs.length > 0 ? refs.flatMap((ref) => this.resolveRef(ref)) : this.getAll();
672
+ const set = {};
673
+ for (const entry of entries) {
674
+ set[entry.name] = entry.tool;
675
+ }
676
+ return set;
677
+ }
678
+ resolveRef(ref) {
679
+ if (typeof ref === "string") {
680
+ const entry = this.getByName(ref);
681
+ if (!entry) {
682
+ throw new Error(`Unknown AI tool "${ref}".`);
683
+ }
684
+ return [
685
+ entry
686
+ ];
687
+ }
688
+ const entries = this.getForClass(ref);
689
+ if (entries.length > 0) {
690
+ return entries;
691
+ }
692
+ const agentEntry = this.resolveAgentRef(ref);
693
+ if (agentEntry) {
694
+ return [
695
+ agentEntry
696
+ ];
697
+ }
698
+ throw new Error(`Class "${ref.name}" declares no @Tool methods and is not a registered @Agent, or was not registered as a provider so it could be discovered.`);
699
+ }
700
+ resolveAgentRef(ref) {
701
+ if (!this.agentRegistry || !Reflect.getMetadata(AGENT_METADATA, ref)) {
702
+ return void 0;
703
+ }
704
+ const instance = this.agentRegistry.getByClass(ref);
705
+ if (!instance) {
706
+ return void 0;
707
+ }
708
+ return {
709
+ name: ref.name,
710
+ tool: createAgentTool(instance, {
711
+ name: ref.name
712
+ }),
713
+ target: ref
714
+ };
715
+ }
716
+ };
717
+ ToolRegistry = _ts_decorate5([
718
+ common.Injectable(),
719
+ _ts_param3(3, common.Optional()),
720
+ _ts_param3(4, common.Optional()),
721
+ _ts_param3(5, common.Optional()),
722
+ _ts_param3(5, common.Inject(APPROVAL_GATE)),
723
+ _ts_param3(6, common.Optional()),
724
+ _ts_metadata5("design:type", Function),
725
+ _ts_metadata5("design:paramtypes", [
726
+ typeof core.DiscoveryService === "undefined" ? Object : core.DiscoveryService,
727
+ typeof core.MetadataScanner === "undefined" ? Object : core.MetadataScanner,
728
+ typeof core.Reflector === "undefined" ? Object : core.Reflector,
729
+ typeof AiEventEmitter === "undefined" ? Object : AiEventEmitter,
730
+ typeof GuardrailRegistry === "undefined" ? Object : GuardrailRegistry,
731
+ typeof ApprovalGate === "undefined" ? Object : ApprovalGate,
732
+ typeof AgentRegistry === "undefined" ? Object : AgentRegistry
733
+ ])
734
+ ], ToolRegistry);
735
+
736
+ // src/core/ai.service.ts
737
+ function _ts_decorate6(decorators, target, key, desc) {
738
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
739
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
740
+ 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;
741
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
742
+ }
743
+ __name(_ts_decorate6, "_ts_decorate");
744
+ function _ts_metadata6(k, v) {
745
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
746
+ }
747
+ __name(_ts_metadata6, "_ts_metadata");
748
+ var AiService = class {
749
+ static {
750
+ __name(this, "AiService");
751
+ }
752
+ providers;
753
+ toolRegistry;
754
+ constructor(providers, toolRegistry) {
755
+ this.providers = providers;
756
+ this.toolRegistry = toolRegistry;
757
+ }
758
+ generateText(params) {
759
+ return ai.generateText(this.resolve(params));
760
+ }
761
+ streamText(params) {
762
+ return ai.streamText(this.resolve(params));
763
+ }
764
+ generateObject(params) {
765
+ return ai.generateObject(this.resolve(params));
766
+ }
767
+ streamObject(params) {
768
+ return ai.streamObject(this.resolve(params));
769
+ }
770
+ resolve(params) {
771
+ const { model, tools, ...rest } = params;
772
+ return {
773
+ ...rest,
774
+ model: this.providers.getLanguageModel(model),
775
+ ...tools ? {
776
+ tools: this.toolRegistry.buildToolSet(tools)
777
+ } : {}
778
+ };
779
+ }
780
+ };
781
+ AiService = _ts_decorate6([
782
+ common.Injectable(),
783
+ _ts_metadata6("design:type", Function),
784
+ _ts_metadata6("design:paramtypes", [
785
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
786
+ typeof ToolRegistry === "undefined" ? Object : ToolRegistry
787
+ ])
788
+ ], AiService);
789
+
790
+ // src/messages/message.types.ts
791
+ function toMessages(input) {
792
+ if (typeof input === "string") {
793
+ return [
794
+ {
795
+ role: "user",
796
+ content: input
797
+ }
798
+ ];
799
+ }
800
+ return input;
801
+ }
802
+ __name(toMessages, "toMessages");
803
+
804
+ // src/prompts/prompt.types.ts
805
+ var PLACEHOLDER = /\{\{\s*([\w.]+)\s*\}\}/g;
806
+ function interpolate(template, vars = {}) {
807
+ return template.replace(PLACEHOLDER, (_match, key) => {
808
+ if (!(key in vars)) {
809
+ throw new Error(`Missing variable "${key}" for prompt interpolation.`);
810
+ }
811
+ const value = vars[key];
812
+ return value == null ? "" : String(value);
813
+ });
814
+ }
815
+ __name(interpolate, "interpolate");
816
+
817
+ // src/prompts/prompt-registry.service.ts
818
+ function _ts_decorate7(decorators, target, key, desc) {
819
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
820
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
821
+ 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;
822
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
823
+ }
824
+ __name(_ts_decorate7, "_ts_decorate");
825
+ var DEFAULT_VERSION = "__default__";
826
+ var PromptRegistry = class {
827
+ static {
828
+ __name(this, "PromptRegistry");
829
+ }
830
+ /** name -> (version -> definition) */
831
+ prompts = /* @__PURE__ */ new Map();
832
+ /** name -> most recently registered version key */
833
+ latest = /* @__PURE__ */ new Map();
834
+ /** Registers a prompt. Throws on a duplicate (name, version). */
835
+ register(definition) {
836
+ const versions = this.prompts.get(definition.name) ?? /* @__PURE__ */ new Map();
837
+ const versionKey = definition.version ?? DEFAULT_VERSION;
838
+ if (versions.has(versionKey)) {
839
+ throw new Error(`Prompt "${definition.name}"${definition.version ? ` version "${definition.version}"` : ""} is already registered.`);
840
+ }
841
+ versions.set(versionKey, definition);
842
+ this.prompts.set(definition.name, versions);
843
+ this.latest.set(definition.name, versionKey);
844
+ }
845
+ /** Registers many prompts. */
846
+ registerAll(definitions) {
847
+ for (const definition of definitions) {
848
+ this.register(definition);
849
+ }
850
+ }
851
+ /** Returns a prompt definition (latest version when `version` omitted). */
852
+ get(name, version) {
853
+ const versions = this.prompts.get(name);
854
+ if (!versions) {
855
+ throw new Error(`Unknown prompt "${name}".`);
856
+ }
857
+ const versionKey = version ?? this.latest.get(name) ?? DEFAULT_VERSION;
858
+ const definition = versions.get(versionKey);
859
+ if (!definition) {
860
+ throw new Error(`Unknown version "${version}" for prompt "${name}".`);
861
+ }
862
+ return definition;
863
+ }
864
+ /** Renders a prompt to a string, interpolating `{{var}}` placeholders. */
865
+ render(name, vars = {}, options = {}) {
866
+ return interpolate(this.get(name, options.version).template, vars);
867
+ }
868
+ /** Whether a prompt (any version) is registered. */
869
+ has(name) {
870
+ return this.prompts.has(name);
871
+ }
872
+ };
873
+ PromptRegistry = _ts_decorate7([
874
+ common.Injectable()
875
+ ], PromptRegistry);
876
+
877
+ // src/usage/pricing.ts
878
+ var DEFAULT_PRICING = {
879
+ "gpt-4o": {
880
+ input: 2.5,
881
+ output: 10
882
+ },
883
+ "gpt-4o-mini": {
884
+ input: 0.15,
885
+ output: 0.6
886
+ },
887
+ "gpt-4.1": {
888
+ input: 2,
889
+ output: 8
890
+ },
891
+ "gpt-4.1-mini": {
892
+ input: 0.4,
893
+ output: 1.6
894
+ },
895
+ "o3-mini": {
896
+ input: 1.1,
897
+ output: 4.4
898
+ },
899
+ "text-embedding-3-small": {
900
+ input: 0.02,
901
+ output: 0
902
+ },
903
+ "text-embedding-3-large": {
904
+ input: 0.13,
905
+ output: 0
906
+ },
907
+ "claude-sonnet-4": {
908
+ input: 3,
909
+ output: 15
910
+ },
911
+ "claude-opus-4": {
912
+ input: 15,
913
+ output: 75
914
+ },
915
+ "claude-haiku-4": {
916
+ input: 0.8,
917
+ output: 4
918
+ },
919
+ "gemini-2.5-pro": {
920
+ input: 1.25,
921
+ output: 10
922
+ },
923
+ "gemini-2.5-flash": {
924
+ input: 0.3,
925
+ output: 2.5
926
+ }
927
+ };
928
+ function bareModelId(modelId) {
929
+ const sep = modelId.indexOf(":");
930
+ return sep === -1 ? modelId : modelId.slice(sep + 1);
931
+ }
932
+ __name(bareModelId, "bareModelId");
933
+ function costOf(usage, modelId, pricing = DEFAULT_PRICING) {
934
+ const price = pricing[bareModelId(modelId)] ?? pricing[modelId];
935
+ if (!price) {
936
+ return 0;
937
+ }
938
+ const input = usage.inputTokens ?? 0;
939
+ const output = usage.outputTokens ?? 0;
940
+ return input / 1e6 * price.input + output / 1e6 * price.output;
941
+ }
942
+ __name(costOf, "costOf");
943
+
944
+ // src/usage/usage-tracker.service.ts
945
+ function _ts_decorate8(decorators, target, key, desc) {
946
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
947
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
948
+ 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;
949
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
950
+ }
951
+ __name(_ts_decorate8, "_ts_decorate");
952
+ function _ts_metadata7(k, v) {
953
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
954
+ }
955
+ __name(_ts_metadata7, "_ts_metadata");
956
+ function _ts_param4(paramIndex, decorator) {
957
+ return function(target, key) {
958
+ decorator(target, key, paramIndex);
959
+ };
960
+ }
961
+ __name(_ts_param4, "_ts_param");
962
+ var GLOBAL = "__global__";
963
+ function empty() {
964
+ return {
965
+ inputTokens: 0,
966
+ outputTokens: 0,
967
+ cost: 0,
968
+ runs: 0
969
+ };
970
+ }
971
+ __name(empty, "empty");
972
+ var UsageTracker = class {
973
+ static {
974
+ __name(this, "UsageTracker");
975
+ }
976
+ options;
977
+ events;
978
+ totalsByScope = /* @__PURE__ */ new Map();
979
+ constructor(options, events) {
980
+ this.options = options;
981
+ this.events = events;
982
+ }
983
+ /** Records a run's usage, returns the single-run record, emits `ai.usage`. */
984
+ record(entry) {
985
+ const usage = entry.usage ?? {};
986
+ const inputTokens = usage.inputTokens ?? 0;
987
+ const outputTokens = usage.outputTokens ?? 0;
988
+ const cost = costOf(usage, entry.model, this.options.pricing);
989
+ for (const scope of [
990
+ GLOBAL,
991
+ entry.conversationId
992
+ ].filter(Boolean)) {
993
+ const totals = this.totalsByScope.get(scope) ?? empty();
994
+ totals.inputTokens += inputTokens;
995
+ totals.outputTokens += outputTokens;
996
+ totals.cost += cost;
997
+ totals.runs += 1;
998
+ this.totalsByScope.set(scope, totals);
999
+ }
1000
+ const record = {
1001
+ conversationId: entry.conversationId,
1002
+ agent: entry.agent,
1003
+ model: entry.model,
1004
+ inputTokens,
1005
+ outputTokens,
1006
+ cost,
1007
+ runs: 1
1008
+ };
1009
+ this.events?.emit(AI_EVENTS.usage, record);
1010
+ return record;
1011
+ }
1012
+ /** Totals for a conversation, or global totals when no id is given. */
1013
+ totals(conversationId) {
1014
+ return {
1015
+ ...this.totalsByScope.get(conversationId ?? GLOBAL) ?? empty()
1016
+ };
1017
+ }
1018
+ /** Clears totals for a conversation (or all when no id). */
1019
+ reset(conversationId) {
1020
+ if (conversationId) {
1021
+ this.totalsByScope.delete(conversationId);
1022
+ } else {
1023
+ this.totalsByScope.clear();
1024
+ }
1025
+ }
1026
+ };
1027
+ UsageTracker = _ts_decorate8([
1028
+ common.Injectable(),
1029
+ _ts_param4(0, common.Inject(AI_MODULE_OPTIONS)),
1030
+ _ts_param4(1, common.Optional()),
1031
+ _ts_metadata7("design:type", Function),
1032
+ _ts_metadata7("design:paramtypes", [
1033
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions,
1034
+ typeof AiEventEmitter === "undefined" ? Object : AiEventEmitter
1035
+ ])
1036
+ ], UsageTracker);
1037
+ function _ts_decorate9(decorators, target, key, desc) {
1038
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1039
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1040
+ 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;
1041
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1042
+ }
1043
+ __name(_ts_decorate9, "_ts_decorate");
1044
+ function _ts_metadata8(k, v) {
1045
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1046
+ }
1047
+ __name(_ts_metadata8, "_ts_metadata");
1048
+ function _ts_param5(paramIndex, decorator) {
1049
+ return function(target, key) {
1050
+ decorator(target, key, paramIndex);
1051
+ };
1052
+ }
1053
+ __name(_ts_param5, "_ts_param");
1054
+ var EmbeddingsService = class {
1055
+ static {
1056
+ __name(this, "EmbeddingsService");
1057
+ }
1058
+ providers;
1059
+ cache;
1060
+ constructor(providers, cache) {
1061
+ this.providers = providers;
1062
+ this.cache = cache;
1063
+ }
1064
+ /** Embeds a single value (cached when a cache is configured). */
1065
+ async embed(value, options = {}) {
1066
+ const model = this.providers.getEmbeddingModel(options.model);
1067
+ const key = `emb:${model.modelId ?? ""}:${value}`;
1068
+ if (this.cache) {
1069
+ const hit = await this.cache.get(key);
1070
+ if (hit !== void 0) {
1071
+ return hit;
1072
+ }
1073
+ }
1074
+ const result = await ai.embed({
1075
+ model,
1076
+ value,
1077
+ abortSignal: options.abortSignal,
1078
+ maxRetries: options.maxRetries
1079
+ });
1080
+ if (this.cache) {
1081
+ await this.cache.set(key, result);
1082
+ }
1083
+ return result;
1084
+ }
1085
+ /** Embeds many values (the SDK batches automatically). */
1086
+ async embedMany(values, options = {}) {
1087
+ return ai.embedMany({
1088
+ model: this.providers.getEmbeddingModel(options.model),
1089
+ values,
1090
+ abortSignal: options.abortSignal,
1091
+ maxRetries: options.maxRetries
1092
+ });
1093
+ }
1094
+ };
1095
+ EmbeddingsService = _ts_decorate9([
1096
+ common.Injectable(),
1097
+ _ts_param5(1, common.Optional()),
1098
+ _ts_param5(1, common.Inject(AI_CACHE)),
1099
+ _ts_metadata8("design:type", Function),
1100
+ _ts_metadata8("design:paramtypes", [
1101
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
1102
+ typeof AiCache === "undefined" ? Object : AiCache
1103
+ ])
1104
+ ], EmbeddingsService);
1105
+
1106
+ // src/memory/semantic/semantic-memory.service.ts
1107
+ function _ts_decorate10(decorators, target, key, desc) {
1108
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1109
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1110
+ 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;
1111
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1112
+ }
1113
+ __name(_ts_decorate10, "_ts_decorate");
1114
+ function _ts_metadata9(k, v) {
1115
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1116
+ }
1117
+ __name(_ts_metadata9, "_ts_metadata");
1118
+ function _ts_param6(paramIndex, decorator) {
1119
+ return function(target, key) {
1120
+ decorator(target, key, paramIndex);
1121
+ };
1122
+ }
1123
+ __name(_ts_param6, "_ts_param");
1124
+ var SemanticMemory = class {
1125
+ static {
1126
+ __name(this, "SemanticMemory");
1127
+ }
1128
+ embeddings;
1129
+ store;
1130
+ ai;
1131
+ constructor(embeddings, store, ai) {
1132
+ this.embeddings = embeddings;
1133
+ this.store = store;
1134
+ this.ai = ai;
1135
+ }
1136
+ /** Embeds and stores a snippet under a conversation. */
1137
+ async remember(conversationId, text, options = {}) {
1138
+ const { embedding } = await this.embeddings.embed(text, {
1139
+ model: options.model
1140
+ });
1141
+ await this.store.upsert([
1142
+ {
1143
+ id: `mem:${conversationId}:${hash(text)}`,
1144
+ content: text,
1145
+ embedding,
1146
+ metadata: {
1147
+ conversationId,
1148
+ kind: "memory",
1149
+ ...options.metadata
1150
+ }
1151
+ }
1152
+ ]);
1153
+ }
1154
+ /** Returns the most relevant stored snippets for a query. */
1155
+ async recall(conversationId, query, options = {}) {
1156
+ const { embedding } = await this.embeddings.embed(query, {
1157
+ model: options.model
1158
+ });
1159
+ return this.store.query(embedding, {
1160
+ topK: options.topK ?? 4,
1161
+ filter: {
1162
+ conversationId,
1163
+ kind: "memory"
1164
+ }
1165
+ });
1166
+ }
1167
+ /**
1168
+ * Summarizes messages with the LLM (requires `AiService`), then stores the
1169
+ * summary as a memory snippet. Returns the stored text.
1170
+ */
1171
+ async rememberConversation(conversationId, input, options = {}) {
1172
+ const text = options.summarize ? await this.summarize(input, options.model) : messagesToText(input);
1173
+ await this.remember(conversationId, text, {
1174
+ model: options.model
1175
+ });
1176
+ return text;
1177
+ }
1178
+ /** Summarizes messages into a compact string via the LLM. */
1179
+ async summarize(input, model) {
1180
+ if (!this.ai) {
1181
+ throw new Error("SemanticMemory.summarize requires AiService.");
1182
+ }
1183
+ const { text } = await this.ai.generateText({
1184
+ model,
1185
+ prompt: `Summarize the following conversation concisely:
1186
+
1187
+ ${messagesToText(input)}`
1188
+ });
1189
+ return text;
1190
+ }
1191
+ };
1192
+ SemanticMemory = _ts_decorate10([
1193
+ common.Injectable(),
1194
+ _ts_param6(1, common.Inject(VECTOR_STORE)),
1195
+ _ts_param6(2, common.Optional()),
1196
+ _ts_metadata9("design:type", Function),
1197
+ _ts_metadata9("design:paramtypes", [
1198
+ typeof EmbeddingsService === "undefined" ? Object : EmbeddingsService,
1199
+ typeof VectorStore === "undefined" ? Object : VectorStore,
1200
+ typeof AiService === "undefined" ? Object : AiService
1201
+ ])
1202
+ ], SemanticMemory);
1203
+ function messagesToText(input) {
1204
+ return toMessages(input).map((m) => {
1205
+ const content = m.content;
1206
+ if (typeof content === "string") {
1207
+ return `${m.role}: ${content}`;
1208
+ }
1209
+ if (Array.isArray(content)) {
1210
+ return `${m.role}: ${content.map((p) => p && typeof p.text === "string" ? p.text : "").join(" ")}`;
1211
+ }
1212
+ return "";
1213
+ }).join("\n");
1214
+ }
1215
+ __name(messagesToText, "messagesToText");
1216
+ function hash(text) {
1217
+ let h = 5381;
1218
+ for (let i = 0; i < text.length; i++) {
1219
+ h = h * 33 ^ text.charCodeAt(i);
1220
+ }
1221
+ return (h >>> 0).toString(36);
1222
+ }
1223
+ __name(hash, "hash");
1224
+
1225
+ // src/agent/agent-executor.service.ts
1226
+ function _ts_decorate11(decorators, target, key, desc) {
1227
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1228
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1229
+ 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;
1230
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1231
+ }
1232
+ __name(_ts_decorate11, "_ts_decorate");
1233
+ function _ts_metadata10(k, v) {
1234
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1235
+ }
1236
+ __name(_ts_metadata10, "_ts_metadata");
1237
+ function _ts_param7(paramIndex, decorator) {
1238
+ return function(target, key) {
1239
+ decorator(target, key, paramIndex);
1240
+ };
1241
+ }
1242
+ __name(_ts_param7, "_ts_param");
1243
+ var AgentExecutorService = class {
1244
+ static {
1245
+ __name(this, "AgentExecutorService");
1246
+ }
1247
+ providers;
1248
+ toolRegistry;
1249
+ store;
1250
+ options;
1251
+ events;
1252
+ guardrails;
1253
+ prompts;
1254
+ usageTracker;
1255
+ semanticMemory;
1256
+ constructor(providers, toolRegistry, store, options, events, guardrails, prompts, usageTracker, semanticMemory) {
1257
+ this.providers = providers;
1258
+ this.toolRegistry = toolRegistry;
1259
+ this.store = store;
1260
+ this.options = options;
1261
+ this.events = events;
1262
+ this.guardrails = guardrails;
1263
+ this.prompts = prompts;
1264
+ this.usageTracker = usageTracker;
1265
+ this.semanticMemory = semanticMemory;
1266
+ }
1267
+ /** Runs an agent to completion and returns its result. */
1268
+ async run(agent, input, opts = {}) {
1269
+ const meta = this.readMetadata(agent);
1270
+ const agentName = agent.constructor?.name ?? "AiAgent";
1271
+ const model = this.providers.getLanguageModel(opts.model ?? meta.model);
1272
+ const system = await this.resolveSystemWithRecall(opts, meta, input);
1273
+ const schema = opts.schema ?? meta.output;
1274
+ const maxSteps = this.resolveMaxSteps(opts, meta);
1275
+ const newMessages = toMessages(input);
1276
+ const history = await this.loadHistory(opts.conversationId);
1277
+ const ctx = {
1278
+ agent: agentName,
1279
+ messages: [
1280
+ ...history,
1281
+ ...newMessages
1282
+ ],
1283
+ options: opts
1284
+ };
1285
+ this.events?.emit(AI_EVENTS.agentRunStart, {
1286
+ agent: agentName,
1287
+ input,
1288
+ options: opts
1289
+ });
1290
+ try {
1291
+ await this.guardrails?.runBeforeRun(ctx);
1292
+ const result = schema ? await this.runObject(model, system, ctx.messages, schema, opts, newMessages) : await this.runText(model, system, ctx.messages, meta, maxSteps, opts, newMessages);
1293
+ this.usageTracker?.record({
1294
+ model: model.modelId ?? "unknown",
1295
+ usage: result.usage,
1296
+ conversationId: opts.conversationId,
1297
+ agent: agentName
1298
+ });
1299
+ await this.guardrails?.runAfterRun(ctx, result);
1300
+ this.events?.emit(AI_EVENTS.agentRunFinish, {
1301
+ agent: agentName,
1302
+ result
1303
+ });
1304
+ return result;
1305
+ } catch (error) {
1306
+ this.events?.emit(AI_EVENTS.agentRunError, {
1307
+ agent: agentName,
1308
+ error
1309
+ });
1310
+ throw error;
1311
+ }
1312
+ }
1313
+ async runObject(model, system, messages, schema, opts, newMessages) {
1314
+ const result = await ai.generateObject({
1315
+ model,
1316
+ system,
1317
+ messages,
1318
+ schema,
1319
+ abortSignal: opts.abortSignal,
1320
+ temperature: opts.temperature,
1321
+ maxRetries: opts.maxRetries ?? this.options.maxRetries,
1322
+ experimental_telemetry: this.telemetry()
1323
+ });
1324
+ await this.persist(opts.conversationId, newMessages, [
1325
+ {
1326
+ role: "assistant",
1327
+ content: JSON.stringify(result.object)
1328
+ }
1329
+ ]);
1330
+ return {
1331
+ text: "",
1332
+ object: result.object,
1333
+ usage: result.usage,
1334
+ finishReason: result.finishReason,
1335
+ messages: []
1336
+ };
1337
+ }
1338
+ async runText(model, system, messages, meta, maxSteps, opts, newMessages) {
1339
+ const result = await ai.generateText({
1340
+ model,
1341
+ system,
1342
+ messages,
1343
+ tools: this.toolRegistry.buildToolSet(meta.tools),
1344
+ stopWhen: ai.stepCountIs(maxSteps),
1345
+ abortSignal: opts.abortSignal,
1346
+ temperature: opts.temperature,
1347
+ maxRetries: opts.maxRetries ?? this.options.maxRetries,
1348
+ experimental_telemetry: this.telemetry()
1349
+ });
1350
+ await this.persist(opts.conversationId, newMessages, result.response.messages);
1351
+ return {
1352
+ text: result.text,
1353
+ steps: result.steps,
1354
+ toolCalls: result.toolCalls,
1355
+ usage: result.totalUsage,
1356
+ finishReason: result.finishReason,
1357
+ messages: result.response.messages
1358
+ };
1359
+ }
1360
+ /**
1361
+ * Streams an agent's response. Returns the raw Vercel stream result so
1362
+ * controllers can pipe it to an HTTP response or iterate `textStream`.
1363
+ * Conversation persistence happens on stream finish.
1364
+ */
1365
+ stream(agent, input, opts = {}) {
1366
+ const meta = this.readMetadata(agent);
1367
+ const agentName = agent.constructor?.name ?? "AiAgent";
1368
+ const model = this.providers.getLanguageModel(opts.model ?? meta.model);
1369
+ const system = this.resolveSystem(opts, meta);
1370
+ const schema = opts.schema ?? meta.output;
1371
+ const maxSteps = this.resolveMaxSteps(opts, meta);
1372
+ const newMessages = toMessages(input);
1373
+ this.events?.emit(AI_EVENTS.agentRunStart, {
1374
+ agent: agentName,
1375
+ input,
1376
+ options: opts
1377
+ });
1378
+ if (schema) {
1379
+ return ai.streamObject({
1380
+ model,
1381
+ system,
1382
+ messages: newMessages,
1383
+ schema,
1384
+ abortSignal: opts.abortSignal,
1385
+ temperature: opts.temperature,
1386
+ experimental_telemetry: this.telemetry(),
1387
+ onFinish: /* @__PURE__ */ __name(async ({ object }) => {
1388
+ if (object !== void 0) {
1389
+ await this.persist(opts.conversationId, newMessages, [
1390
+ {
1391
+ role: "assistant",
1392
+ content: JSON.stringify(object)
1393
+ }
1394
+ ]);
1395
+ }
1396
+ this.events?.emit(AI_EVENTS.streamFinish, {
1397
+ agent: agentName
1398
+ });
1399
+ }, "onFinish")
1400
+ });
1401
+ }
1402
+ return ai.streamText({
1403
+ model,
1404
+ system,
1405
+ messages: newMessages,
1406
+ tools: this.toolRegistry.buildToolSet(meta.tools),
1407
+ stopWhen: ai.stepCountIs(maxSteps),
1408
+ abortSignal: opts.abortSignal,
1409
+ temperature: opts.temperature,
1410
+ maxRetries: opts.maxRetries ?? this.options.maxRetries,
1411
+ experimental_telemetry: this.telemetry(),
1412
+ onFinish: /* @__PURE__ */ __name(async ({ response }) => {
1413
+ await this.persist(opts.conversationId, newMessages, response.messages);
1414
+ this.events?.emit(AI_EVENTS.streamFinish, {
1415
+ agent: agentName
1416
+ });
1417
+ }, "onFinish")
1418
+ });
1419
+ }
1420
+ /** Resolves the system prompt and prepends recalled memory when requested. */
1421
+ async resolveSystemWithRecall(opts, meta, input) {
1422
+ let system = this.resolveSystem(opts, meta);
1423
+ if (opts.recall && opts.conversationId && this.semanticMemory) {
1424
+ const query = opts.recall.query ?? (typeof input === "string" ? input : "");
1425
+ if (query) {
1426
+ const snippets = await this.semanticMemory.recall(opts.conversationId, query, {
1427
+ topK: opts.recall.topK
1428
+ });
1429
+ if (snippets.length > 0) {
1430
+ const context = snippets.map((s) => s.content).join("\n");
1431
+ system = [
1432
+ system,
1433
+ `Relevant context from memory:
1434
+ ${context}`
1435
+ ].filter(Boolean).join("\n\n");
1436
+ }
1437
+ }
1438
+ }
1439
+ return system;
1440
+ }
1441
+ resolveSystem(opts, meta) {
1442
+ if (opts.systemPrompt) {
1443
+ if (!this.prompts) {
1444
+ throw new Error("systemPrompt requires the PromptRegistry (AiModule must be imported).");
1445
+ }
1446
+ return this.prompts.render(opts.systemPrompt.name, opts.systemPrompt.vars, {
1447
+ version: opts.systemPrompt.version
1448
+ });
1449
+ }
1450
+ return opts.system ?? meta.system;
1451
+ }
1452
+ telemetry() {
1453
+ const t = this.options.telemetry;
1454
+ if (!t?.isEnabled) {
1455
+ return void 0;
1456
+ }
1457
+ return {
1458
+ isEnabled: true,
1459
+ functionId: t.functionId
1460
+ };
1461
+ }
1462
+ readMetadata(agent) {
1463
+ const ctor = agent.constructor;
1464
+ return Reflect.getMetadata(AGENT_METADATA, ctor) ?? {};
1465
+ }
1466
+ resolveMaxSteps(opts, meta) {
1467
+ return opts.maxSteps ?? meta.maxSteps ?? this.options.defaultMaxSteps ?? DEFAULT_MAX_STEPS;
1468
+ }
1469
+ async loadHistory(conversationId) {
1470
+ if (!conversationId) {
1471
+ return [];
1472
+ }
1473
+ return this.store.load(conversationId);
1474
+ }
1475
+ async persist(conversationId, userMessages, responseMessages) {
1476
+ if (!conversationId) {
1477
+ return;
1478
+ }
1479
+ await this.store.append(conversationId, [
1480
+ ...userMessages,
1481
+ ...responseMessages
1482
+ ]);
1483
+ }
1484
+ };
1485
+ AgentExecutorService = _ts_decorate11([
1486
+ common.Injectable(),
1487
+ _ts_param7(2, common.Inject(CONVERSATION_STORE)),
1488
+ _ts_param7(3, common.Inject(AI_MODULE_OPTIONS)),
1489
+ _ts_param7(4, common.Optional()),
1490
+ _ts_param7(5, common.Optional()),
1491
+ _ts_param7(6, common.Optional()),
1492
+ _ts_param7(7, common.Optional()),
1493
+ _ts_param7(8, common.Optional()),
1494
+ _ts_metadata10("design:type", Function),
1495
+ _ts_metadata10("design:paramtypes", [
1496
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
1497
+ typeof ToolRegistry === "undefined" ? Object : ToolRegistry,
1498
+ typeof ConversationStore === "undefined" ? Object : ConversationStore,
1499
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions,
1500
+ typeof AiEventEmitter === "undefined" ? Object : AiEventEmitter,
1501
+ typeof GuardrailRegistry === "undefined" ? Object : GuardrailRegistry,
1502
+ typeof PromptRegistry === "undefined" ? Object : PromptRegistry,
1503
+ typeof UsageTracker === "undefined" ? Object : UsageTracker,
1504
+ typeof SemanticMemory === "undefined" ? Object : SemanticMemory
1505
+ ])
1506
+ ], AgentExecutorService);
1507
+ function _ts_decorate12(decorators, target, key, desc) {
1508
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1509
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1510
+ 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;
1511
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1512
+ }
1513
+ __name(_ts_decorate12, "_ts_decorate");
1514
+ var InMemoryConversationStore = class {
1515
+ static {
1516
+ __name(this, "InMemoryConversationStore");
1517
+ }
1518
+ conversations = /* @__PURE__ */ new Map();
1519
+ async load(conversationId) {
1520
+ return [
1521
+ ...this.conversations.get(conversationId) ?? []
1522
+ ];
1523
+ }
1524
+ async append(conversationId, messages) {
1525
+ const existing = this.conversations.get(conversationId) ?? [];
1526
+ this.conversations.set(conversationId, [
1527
+ ...existing,
1528
+ ...messages
1529
+ ]);
1530
+ }
1531
+ async clear(conversationId) {
1532
+ this.conversations.delete(conversationId);
1533
+ }
1534
+ };
1535
+ InMemoryConversationStore = _ts_decorate12([
1536
+ common.Injectable()
1537
+ ], InMemoryConversationStore);
1538
+ function _ts_decorate13(decorators, target, key, desc) {
1539
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1540
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1541
+ 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;
1542
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1543
+ }
1544
+ __name(_ts_decorate13, "_ts_decorate");
1545
+ function _ts_metadata11(k, v) {
1546
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1547
+ }
1548
+ __name(_ts_metadata11, "_ts_metadata");
1549
+ var ImageService = class {
1550
+ static {
1551
+ __name(this, "ImageService");
1552
+ }
1553
+ providers;
1554
+ constructor(providers) {
1555
+ this.providers = providers;
1556
+ }
1557
+ generate(prompt, options = {}) {
1558
+ const { model, ...rest } = options;
1559
+ return ai.generateImage({
1560
+ model: this.providers.getImageModel(model),
1561
+ prompt,
1562
+ ...rest
1563
+ });
1564
+ }
1565
+ };
1566
+ ImageService = _ts_decorate13([
1567
+ common.Injectable(),
1568
+ _ts_metadata11("design:type", Function),
1569
+ _ts_metadata11("design:paramtypes", [
1570
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry
1571
+ ])
1572
+ ], ImageService);
1573
+ function _ts_decorate14(decorators, target, key, desc) {
1574
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1575
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1576
+ 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;
1577
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1578
+ }
1579
+ __name(_ts_decorate14, "_ts_decorate");
1580
+ function _ts_metadata12(k, v) {
1581
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1582
+ }
1583
+ __name(_ts_metadata12, "_ts_metadata");
1584
+ var SpeechService = class {
1585
+ static {
1586
+ __name(this, "SpeechService");
1587
+ }
1588
+ providers;
1589
+ constructor(providers) {
1590
+ this.providers = providers;
1591
+ }
1592
+ generate(text, options = {}) {
1593
+ const { model, ...rest } = options;
1594
+ return ai.experimental_generateSpeech({
1595
+ model: this.providers.getSpeechModel(model),
1596
+ text,
1597
+ ...rest
1598
+ });
1599
+ }
1600
+ };
1601
+ SpeechService = _ts_decorate14([
1602
+ common.Injectable(),
1603
+ _ts_metadata12("design:type", Function),
1604
+ _ts_metadata12("design:paramtypes", [
1605
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry
1606
+ ])
1607
+ ], SpeechService);
1608
+ function _ts_decorate15(decorators, target, key, desc) {
1609
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1610
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1611
+ 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;
1612
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1613
+ }
1614
+ __name(_ts_decorate15, "_ts_decorate");
1615
+ function _ts_metadata13(k, v) {
1616
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1617
+ }
1618
+ __name(_ts_metadata13, "_ts_metadata");
1619
+ var TranscriptionService = class {
1620
+ static {
1621
+ __name(this, "TranscriptionService");
1622
+ }
1623
+ providers;
1624
+ constructor(providers) {
1625
+ this.providers = providers;
1626
+ }
1627
+ transcribe(audio, options = {}) {
1628
+ const { model, ...rest } = options;
1629
+ return ai.experimental_transcribe({
1630
+ model: this.providers.getTranscriptionModel(model),
1631
+ audio,
1632
+ ...rest
1633
+ });
1634
+ }
1635
+ };
1636
+ TranscriptionService = _ts_decorate15([
1637
+ common.Injectable(),
1638
+ _ts_metadata13("design:type", Function),
1639
+ _ts_metadata13("design:paramtypes", [
1640
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry
1641
+ ])
1642
+ ], TranscriptionService);
1643
+ function _ts_decorate16(decorators, target, key, desc) {
1644
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1645
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1646
+ 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;
1647
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1648
+ }
1649
+ __name(_ts_decorate16, "_ts_decorate");
1650
+ function _ts_metadata14(k, v) {
1651
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1652
+ }
1653
+ __name(_ts_metadata14, "_ts_metadata");
1654
+ function _ts_param8(paramIndex, decorator) {
1655
+ return function(target, key) {
1656
+ decorator(target, key, paramIndex);
1657
+ };
1658
+ }
1659
+ __name(_ts_param8, "_ts_param");
1660
+ var RagService = class {
1661
+ static {
1662
+ __name(this, "RagService");
1663
+ }
1664
+ embeddings;
1665
+ store;
1666
+ defaultReranker;
1667
+ constructor(embeddings, store, defaultReranker) {
1668
+ this.embeddings = embeddings;
1669
+ this.store = store;
1670
+ this.defaultReranker = defaultReranker;
1671
+ }
1672
+ /** Chunks, embeds, and upserts items into the vector store. */
1673
+ async ingest(items, options = {}) {
1674
+ const chunkSize = options.chunkSize ?? 1e3;
1675
+ const overlap2 = options.chunkOverlap ?? 100;
1676
+ const chunks = [];
1677
+ items.forEach((item, index) => {
1678
+ const baseId = item.id ?? `doc-${index}`;
1679
+ splitText(item.content, chunkSize, overlap2).forEach((text, chunkIndex) => {
1680
+ chunks.push({
1681
+ id: `${baseId}#${chunkIndex}`,
1682
+ content: text,
1683
+ metadata: item.metadata
1684
+ });
1685
+ });
1686
+ });
1687
+ if (chunks.length === 0) {
1688
+ return;
1689
+ }
1690
+ const { embeddings } = await this.embeddings.embedMany(chunks.map((c) => c.content), {
1691
+ model: options.model
1692
+ });
1693
+ const documents = chunks.map((chunk, i) => ({
1694
+ ...chunk,
1695
+ embedding: embeddings[i]
1696
+ }));
1697
+ await this.store.upsert(documents);
1698
+ }
1699
+ /** Embeds `query` and returns the most similar stored chunks. */
1700
+ async retrieve(query, options = {}) {
1701
+ const { embedding } = await this.embeddings.embed(query, {
1702
+ model: options.model
1703
+ });
1704
+ const topK = options.topK ?? 4;
1705
+ const reranker = options.rerank === true ? this.defaultReranker : options.rerank || void 0;
1706
+ const fetchK = reranker ? options.fetchK ?? topK * 4 : topK;
1707
+ const results = await this.store.query(embedding, {
1708
+ topK: fetchK,
1709
+ filter: options.filter
1710
+ });
1711
+ if (reranker) {
1712
+ return reranker.rerank(query, results, topK);
1713
+ }
1714
+ return results.slice(0, topK);
1715
+ }
1716
+ };
1717
+ RagService = _ts_decorate16([
1718
+ common.Injectable(),
1719
+ _ts_param8(1, common.Inject(VECTOR_STORE)),
1720
+ _ts_param8(2, common.Optional()),
1721
+ _ts_param8(2, common.Inject(RERANKER)),
1722
+ _ts_metadata14("design:type", Function),
1723
+ _ts_metadata14("design:paramtypes", [
1724
+ typeof EmbeddingsService === "undefined" ? Object : EmbeddingsService,
1725
+ typeof VectorStore === "undefined" ? Object : VectorStore,
1726
+ typeof Reranker === "undefined" ? Object : Reranker
1727
+ ])
1728
+ ], RagService);
1729
+ function splitText(text, chunkSize, overlap2) {
1730
+ if (chunkSize <= 0 || text.length <= chunkSize) {
1731
+ return text.length > 0 ? [
1732
+ text
1733
+ ] : [];
1734
+ }
1735
+ const step = Math.max(1, chunkSize - overlap2);
1736
+ const chunks = [];
1737
+ for (let start = 0; start < text.length; start += step) {
1738
+ chunks.push(text.slice(start, start + chunkSize));
1739
+ if (start + chunkSize >= text.length) {
1740
+ break;
1741
+ }
1742
+ }
1743
+ return chunks;
1744
+ }
1745
+ __name(splitText, "splitText");
1746
+ function _ts_decorate17(decorators, target, key, desc) {
1747
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1748
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1749
+ 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;
1750
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1751
+ }
1752
+ __name(_ts_decorate17, "_ts_decorate");
1753
+ var InMemoryVectorStore = class {
1754
+ static {
1755
+ __name(this, "InMemoryVectorStore");
1756
+ }
1757
+ documents = /* @__PURE__ */ new Map();
1758
+ async upsert(documents) {
1759
+ for (const doc of documents) {
1760
+ if (!doc.embedding) {
1761
+ throw new Error(`Document "${doc.id}" has no embedding. InMemoryVectorStore requires precomputed embeddings (use RagService.ingest).`);
1762
+ }
1763
+ this.documents.set(doc.id, doc);
1764
+ }
1765
+ }
1766
+ async query(embedding, options = {}) {
1767
+ const topK = options.topK ?? 4;
1768
+ const filter = options.filter;
1769
+ const scored = [];
1770
+ for (const doc of this.documents.values()) {
1771
+ if (filter && !this.matchesFilter(doc, filter)) {
1772
+ continue;
1773
+ }
1774
+ scored.push({
1775
+ id: doc.id,
1776
+ content: doc.content,
1777
+ score: ai.cosineSimilarity(embedding, doc.embedding),
1778
+ metadata: doc.metadata
1779
+ });
1780
+ }
1781
+ return scored.sort((a, b) => b.score - a.score).slice(0, topK);
1782
+ }
1783
+ async delete(ids) {
1784
+ for (const id of ids) {
1785
+ this.documents.delete(id);
1786
+ }
1787
+ }
1788
+ async clear() {
1789
+ this.documents.clear();
1790
+ }
1791
+ matchesFilter(doc, filter) {
1792
+ return Object.entries(filter).every(([key, value]) => doc.metadata?.[key] === value);
1793
+ }
1794
+ };
1795
+ InMemoryVectorStore = _ts_decorate17([
1796
+ common.Injectable()
1797
+ ], InMemoryVectorStore);
1798
+ function _ts_decorate18(decorators, target, key, desc) {
1799
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1800
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1801
+ 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;
1802
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1803
+ }
1804
+ __name(_ts_decorate18, "_ts_decorate");
1805
+ var McpService = class {
1806
+ static {
1807
+ __name(this, "McpService");
1808
+ }
1809
+ clients = /* @__PURE__ */ new Map();
1810
+ toolSets = /* @__PURE__ */ new Map();
1811
+ /**
1812
+ * Registers an MCP client under `name`, lists its tools, and builds a
1813
+ * matching AI SDK tool set. Returns the tool set.
1814
+ */
1815
+ async connect(name, client) {
1816
+ const { tools } = await client.listTools();
1817
+ const set = {};
1818
+ for (const info of tools) {
1819
+ set[info.name] = ai.dynamicTool({
1820
+ description: info.description ?? info.name,
1821
+ inputSchema: ai.jsonSchema(info.inputSchema),
1822
+ execute: /* @__PURE__ */ __name(async (args) => {
1823
+ const result = await client.callTool({
1824
+ name: info.name,
1825
+ arguments: args ?? {}
1826
+ });
1827
+ return extractText(result);
1828
+ }, "execute")
1829
+ });
1830
+ }
1831
+ this.clients.set(name, client);
1832
+ this.toolSets.set(name, set);
1833
+ return set;
1834
+ }
1835
+ /** Returns the tool set for a connected server (empty if unknown). */
1836
+ getToolSet(name) {
1837
+ return this.toolSets.get(name) ?? {};
1838
+ }
1839
+ /** Returns tool sets for all connected servers, merged. */
1840
+ getAllTools() {
1841
+ return Object.assign({}, ...this.toolSets.values());
1842
+ }
1843
+ async onModuleDestroy() {
1844
+ await this.closeAll();
1845
+ }
1846
+ /** Closes every connected client. */
1847
+ async closeAll() {
1848
+ for (const client of this.clients.values()) {
1849
+ await client.close?.();
1850
+ }
1851
+ this.clients.clear();
1852
+ this.toolSets.clear();
1853
+ }
1854
+ };
1855
+ McpService = _ts_decorate18([
1856
+ common.Injectable()
1857
+ ], McpService);
1858
+ function extractText(result) {
1859
+ if (!result.content) {
1860
+ return "";
1861
+ }
1862
+ return result.content.filter((part) => part.type === "text" && typeof part.text === "string").map((part) => part.text).join("\n");
1863
+ }
1864
+ __name(extractText, "extractText");
1865
+ function Guardrail() {
1866
+ return (target) => {
1867
+ Reflect.defineMetadata(GUARDRAIL_METADATA, true, target);
1868
+ common.Injectable()(target);
1869
+ };
1870
+ }
1871
+ __name(Guardrail, "Guardrail");
1872
+
1873
+ // src/usage/budget.guardrail.ts
1874
+ function _ts_decorate19(decorators, target, key, desc) {
1875
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1876
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1877
+ 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;
1878
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1879
+ }
1880
+ __name(_ts_decorate19, "_ts_decorate");
1881
+ function _ts_metadata15(k, v) {
1882
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1883
+ }
1884
+ __name(_ts_metadata15, "_ts_metadata");
1885
+ function _ts_param9(paramIndex, decorator) {
1886
+ return function(target, key) {
1887
+ decorator(target, key, paramIndex);
1888
+ };
1889
+ }
1890
+ __name(_ts_param9, "_ts_param");
1891
+ var BudgetExceededError = class extends Error {
1892
+ static {
1893
+ __name(this, "BudgetExceededError");
1894
+ }
1895
+ conversationId;
1896
+ spent;
1897
+ limit;
1898
+ constructor(conversationId, spent, limit) {
1899
+ super(`Budget exceeded${conversationId ? ` for "${conversationId}"` : ""}: $${spent.toFixed(4)} >= $${limit.toFixed(4)}.`), this.conversationId = conversationId, this.spent = spent, this.limit = limit;
1900
+ this.name = "BudgetExceededError";
1901
+ }
1902
+ };
1903
+ var BudgetGuard = class {
1904
+ static {
1905
+ __name(this, "BudgetGuard");
1906
+ }
1907
+ usage;
1908
+ options;
1909
+ constructor(usage, options) {
1910
+ this.usage = usage;
1911
+ this.options = options;
1912
+ }
1913
+ beforeRun(ctx) {
1914
+ const limit = this.options.maxCostPerConversation;
1915
+ if (limit == null) {
1916
+ return;
1917
+ }
1918
+ const { cost } = this.usage.totals(ctx.options.conversationId);
1919
+ if (cost >= limit) {
1920
+ throw new BudgetExceededError(ctx.options.conversationId, cost, limit);
1921
+ }
1922
+ }
1923
+ };
1924
+ BudgetGuard = _ts_decorate19([
1925
+ Guardrail(),
1926
+ common.Injectable(),
1927
+ _ts_param9(1, common.Inject(AI_MODULE_OPTIONS)),
1928
+ _ts_metadata15("design:type", Function),
1929
+ _ts_metadata15("design:paramtypes", [
1930
+ typeof UsageTracker === "undefined" ? Object : UsageTracker,
1931
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions
1932
+ ])
1933
+ ], BudgetGuard);
1934
+
1935
+ // src/ratelimit/rate-limiter.interface.ts
1936
+ var RateLimitedError = class extends Error {
1937
+ static {
1938
+ __name(this, "RateLimitedError");
1939
+ }
1940
+ key;
1941
+ constructor(key) {
1942
+ super(`Rate limit exceeded for "${key}".`), this.key = key;
1943
+ this.name = "RateLimitedError";
1944
+ }
1945
+ };
1946
+
1947
+ // src/ratelimit/rate-limit.guardrail.ts
1948
+ function _ts_decorate20(decorators, target, key, desc) {
1949
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1950
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1951
+ 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;
1952
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1953
+ }
1954
+ __name(_ts_decorate20, "_ts_decorate");
1955
+ function _ts_metadata16(k, v) {
1956
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1957
+ }
1958
+ __name(_ts_metadata16, "_ts_metadata");
1959
+ function _ts_param10(paramIndex, decorator) {
1960
+ return function(target, key) {
1961
+ decorator(target, key, paramIndex);
1962
+ };
1963
+ }
1964
+ __name(_ts_param10, "_ts_param");
1965
+ var RateLimitGuardrail = class {
1966
+ static {
1967
+ __name(this, "RateLimitGuardrail");
1968
+ }
1969
+ limiter;
1970
+ constructor(limiter) {
1971
+ this.limiter = limiter;
1972
+ }
1973
+ async beforeRun(ctx) {
1974
+ const key = ctx.options.conversationId ?? "global";
1975
+ const allowed = await this.limiter.consume(key);
1976
+ if (!allowed) {
1977
+ throw new RateLimitedError(key);
1978
+ }
1979
+ }
1980
+ };
1981
+ RateLimitGuardrail = _ts_decorate20([
1982
+ Guardrail(),
1983
+ common.Injectable(),
1984
+ _ts_param10(0, common.Inject(RATE_LIMITER)),
1985
+ _ts_metadata16("design:type", Function),
1986
+ _ts_metadata16("design:paramtypes", [
1987
+ typeof RateLimiter === "undefined" ? Object : RateLimiter
1988
+ ])
1989
+ ], RateLimitGuardrail);
1990
+ function _ts_decorate21(decorators, target, key, desc) {
1991
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1992
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1993
+ 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;
1994
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1995
+ }
1996
+ __name(_ts_decorate21, "_ts_decorate");
1997
+ function _ts_metadata17(k, v) {
1998
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1999
+ }
2000
+ __name(_ts_metadata17, "_ts_metadata");
2001
+ function _ts_param11(paramIndex, decorator) {
2002
+ return function(target, key) {
2003
+ decorator(target, key, paramIndex);
2004
+ };
2005
+ }
2006
+ __name(_ts_param11, "_ts_param");
2007
+ var HeuristicReranker = class {
2008
+ static {
2009
+ __name(this, "HeuristicReranker");
2010
+ }
2011
+ options;
2012
+ constructor(options = {}) {
2013
+ this.options = options;
2014
+ }
2015
+ async rerank(query, results, topN) {
2016
+ const weight = this.options.overlapWeight ?? 0.5;
2017
+ const terms = tokenize(query);
2018
+ return results.map((result) => ({
2019
+ result,
2020
+ score: result.score + weight * overlap(terms, result.content)
2021
+ })).sort((a, b) => b.score - a.score).slice(0, topN).map(({ result, score }) => ({
2022
+ ...result,
2023
+ score
2024
+ }));
2025
+ }
2026
+ };
2027
+ HeuristicReranker = _ts_decorate21([
2028
+ common.Injectable(),
2029
+ _ts_param11(0, common.Optional()),
2030
+ _ts_metadata17("design:type", Function),
2031
+ _ts_metadata17("design:paramtypes", [
2032
+ typeof HeuristicRerankerOptions === "undefined" ? Object : HeuristicRerankerOptions
2033
+ ])
2034
+ ], HeuristicReranker);
2035
+ function tokenize(text) {
2036
+ return new Set(text.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 2));
2037
+ }
2038
+ __name(tokenize, "tokenize");
2039
+ function overlap(terms, content) {
2040
+ if (terms.size === 0) {
2041
+ return 0;
2042
+ }
2043
+ const contentTerms = tokenize(content);
2044
+ let hits = 0;
2045
+ for (const term of terms) {
2046
+ if (contentTerms.has(term)) {
2047
+ hits++;
2048
+ }
2049
+ }
2050
+ return hits / terms.size;
2051
+ }
2052
+ __name(overlap, "overlap");
2053
+ function _ts_decorate22(decorators, target, key, desc) {
2054
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2055
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2056
+ 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;
2057
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2058
+ }
2059
+ __name(_ts_decorate22, "_ts_decorate");
2060
+ var EvalRunner = class {
2061
+ static {
2062
+ __name(this, "EvalRunner");
2063
+ }
2064
+ async run(agent, cases, options = {}) {
2065
+ const judge = options.judge ?? defaultJudge(options.passThreshold ?? 1);
2066
+ const results = [];
2067
+ for (const evalCase of cases) {
2068
+ const { text } = await agent.run(evalCase.input);
2069
+ const score = await judge({
2070
+ case: evalCase,
2071
+ output: text
2072
+ });
2073
+ results.push({
2074
+ name: evalCase.name ?? evalCase.input,
2075
+ input: evalCase.input,
2076
+ output: text,
2077
+ ...score
2078
+ });
2079
+ }
2080
+ const averageScore = results.length ? results.reduce((sum, r) => sum + r.score, 0) / results.length : 0;
2081
+ const passRate = results.length ? results.filter((r) => r.passed).length / results.length : 0;
2082
+ return {
2083
+ results,
2084
+ averageScore,
2085
+ passRate
2086
+ };
2087
+ }
2088
+ };
2089
+ EvalRunner = _ts_decorate22([
2090
+ common.Injectable()
2091
+ ], EvalRunner);
2092
+ function defaultJudge(threshold) {
2093
+ return ({ case: evalCase, output }) => {
2094
+ if (evalCase.expected == null) {
2095
+ return {
2096
+ score: 0,
2097
+ passed: false,
2098
+ reasoning: "no expected value or judge"
2099
+ };
2100
+ }
2101
+ const score = output.includes(evalCase.expected) ? 1 : 0;
2102
+ return {
2103
+ score,
2104
+ passed: score >= threshold
2105
+ };
2106
+ };
2107
+ }
2108
+ __name(defaultJudge, "defaultJudge");
2109
+
2110
+ // src/ai.module.ts
2111
+ function _ts_decorate23(decorators, target, key, desc) {
2112
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2113
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2114
+ 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;
2115
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2116
+ }
2117
+ __name(_ts_decorate23, "_ts_decorate");
2118
+ var AI_INITIALIZER = /* @__PURE__ */ Symbol("AI_INITIALIZER");
2119
+ var AiModule = class _AiModule {
2120
+ static {
2121
+ __name(this, "AiModule");
2122
+ }
2123
+ /** Configure the module with static options. */
2124
+ static forRoot(options = {}) {
2125
+ return _AiModule.build({
2126
+ provide: AI_MODULE_OPTIONS,
2127
+ useValue: options
2128
+ }, options);
2129
+ }
2130
+ /** Configure the module asynchronously (e.g. from `ConfigService`). */
2131
+ static forRootAsync(options) {
2132
+ return _AiModule.build({
2133
+ provide: AI_MODULE_OPTIONS,
2134
+ useFactory: options.useFactory,
2135
+ inject: options.inject ?? []
2136
+ }, options, options.imports);
2137
+ }
2138
+ /**
2139
+ * Convenience registration of agents / tools / guardrails so they don't have
2140
+ * to be added to a consuming module's own `providers` array, plus feature
2141
+ * prompts. Discovery still finds providers globally regardless of where they
2142
+ * are registered.
2143
+ */
2144
+ static forFeature(feature = {}) {
2145
+ const providers = [
2146
+ ...feature.agents ?? [],
2147
+ ...feature.tools ?? [],
2148
+ ...feature.guardrails ?? []
2149
+ ];
2150
+ if (feature.prompts?.length) {
2151
+ providers.push({
2152
+ provide: /* @__PURE__ */ Symbol("AI_FEATURE_PROMPTS"),
2153
+ useFactory: /* @__PURE__ */ __name((registry) => {
2154
+ registry.registerAll(feature.prompts);
2155
+ return true;
2156
+ }, "useFactory"),
2157
+ inject: [
2158
+ PromptRegistry
2159
+ ]
2160
+ });
2161
+ }
2162
+ return {
2163
+ module: _AiModule,
2164
+ providers,
2165
+ exports: providers
2166
+ };
2167
+ }
2168
+ static build(optionsProvider, options, extraImports = []) {
2169
+ return {
2170
+ module: _AiModule,
2171
+ imports: [
2172
+ core.DiscoveryModule,
2173
+ ...extraImports ?? []
2174
+ ],
2175
+ providers: [
2176
+ optionsProvider,
2177
+ _AiModule.storeProvider(options.conversationStore),
2178
+ _AiModule.vectorStoreProvider(options.vectorStore),
2179
+ _AiModule.eventEmitterProvider(),
2180
+ ..._AiModule.tokenProvider(AI_CACHE, options.cache),
2181
+ ..._AiModule.tokenProvider(APPROVAL_GATE, options.approvalGate),
2182
+ ..._AiModule.tokenProvider(RATE_LIMITER, options.rateLimiter),
2183
+ ..._AiModule.guardrailClasses(options.guardrails),
2184
+ ...options.maxCostPerConversation != null ? [
2185
+ BudgetGuard
2186
+ ] : [],
2187
+ ...options.rateLimiter ? [
2188
+ RateLimitGuardrail
2189
+ ] : [],
2190
+ ..._AiModule.coreProviders(),
2191
+ _AiModule.initializerProvider()
2192
+ ],
2193
+ exports: _AiModule.exportedTokens()
2194
+ };
2195
+ }
2196
+ static coreProviders() {
2197
+ return [
2198
+ ProviderRegistry,
2199
+ ToolRegistry,
2200
+ AgentExecutorService,
2201
+ AgentRegistry,
2202
+ AiService,
2203
+ EmbeddingsService,
2204
+ ImageService,
2205
+ SpeechService,
2206
+ TranscriptionService,
2207
+ RagService,
2208
+ PromptRegistry,
2209
+ AiEventEmitter,
2210
+ GuardrailRegistry,
2211
+ McpService,
2212
+ UsageTracker,
2213
+ SemanticMemory,
2214
+ EvalRunner,
2215
+ {
2216
+ provide: RERANKER,
2217
+ useFactory: /* @__PURE__ */ __name(() => new HeuristicReranker(), "useFactory")
2218
+ }
2219
+ ];
2220
+ }
2221
+ /**
2222
+ * Registers an optional provider (class / factory / value / useClass shape)
2223
+ * under `token`, or nothing when not configured.
2224
+ */
2225
+ static tokenProvider(token, config) {
2226
+ if (!config) {
2227
+ return [];
2228
+ }
2229
+ if (typeof config === "function") {
2230
+ return [
2231
+ {
2232
+ provide: token,
2233
+ useClass: config
2234
+ }
2235
+ ];
2236
+ }
2237
+ return [
2238
+ {
2239
+ provide: token,
2240
+ ...config
2241
+ }
2242
+ ];
2243
+ }
2244
+ static exportedTokens() {
2245
+ return [
2246
+ ProviderRegistry,
2247
+ ToolRegistry,
2248
+ AgentExecutorService,
2249
+ AgentRegistry,
2250
+ AiService,
2251
+ EmbeddingsService,
2252
+ ImageService,
2253
+ SpeechService,
2254
+ TranscriptionService,
2255
+ RagService,
2256
+ PromptRegistry,
2257
+ AiEventEmitter,
2258
+ GuardrailRegistry,
2259
+ McpService,
2260
+ UsageTracker,
2261
+ SemanticMemory,
2262
+ EvalRunner,
2263
+ RERANKER,
2264
+ CONVERSATION_STORE,
2265
+ VECTOR_STORE,
2266
+ AI_MODULE_OPTIONS
2267
+ ];
2268
+ }
2269
+ static guardrailClasses(guardrails) {
2270
+ return guardrails ?? [];
2271
+ }
2272
+ /** Seeds prompts (and future startup wiring) once dependencies exist. */
2273
+ static initializerProvider() {
2274
+ return {
2275
+ provide: AI_INITIALIZER,
2276
+ useFactory: /* @__PURE__ */ __name((registry, opts) => {
2277
+ if (opts.prompts?.length) {
2278
+ registry.registerAll(opts.prompts);
2279
+ }
2280
+ return true;
2281
+ }, "useFactory"),
2282
+ inject: [
2283
+ PromptRegistry,
2284
+ AI_MODULE_OPTIONS
2285
+ ]
2286
+ };
2287
+ }
2288
+ /**
2289
+ * Optionally resolves `EventEmitter2` from `@nestjs/event-emitter` if the
2290
+ * package is installed and its module is imported; otherwise `undefined`.
2291
+ */
2292
+ static eventEmitterProvider() {
2293
+ return {
2294
+ provide: EVENT_EMITTER,
2295
+ useFactory: /* @__PURE__ */ __name(async (moduleRef) => {
2296
+ try {
2297
+ const mod = await import('@nestjs/event-emitter');
2298
+ return moduleRef.get(mod.EventEmitter2, {
2299
+ strict: false
2300
+ });
2301
+ } catch {
2302
+ return void 0;
2303
+ }
2304
+ }, "useFactory"),
2305
+ inject: [
2306
+ core.ModuleRef
2307
+ ]
2308
+ };
2309
+ }
2310
+ static storeProvider(store) {
2311
+ if (!store) {
2312
+ return {
2313
+ provide: CONVERSATION_STORE,
2314
+ useClass: InMemoryConversationStore
2315
+ };
2316
+ }
2317
+ if (typeof store === "function") {
2318
+ return {
2319
+ provide: CONVERSATION_STORE,
2320
+ useClass: store
2321
+ };
2322
+ }
2323
+ return {
2324
+ provide: CONVERSATION_STORE,
2325
+ ...store
2326
+ };
2327
+ }
2328
+ static vectorStoreProvider(store) {
2329
+ if (!store) {
2330
+ return {
2331
+ provide: VECTOR_STORE,
2332
+ useClass: InMemoryVectorStore
2333
+ };
2334
+ }
2335
+ if (typeof store === "function") {
2336
+ return {
2337
+ provide: VECTOR_STORE,
2338
+ useClass: store
2339
+ };
2340
+ }
2341
+ return {
2342
+ provide: VECTOR_STORE,
2343
+ ...store
2344
+ };
2345
+ }
2346
+ };
2347
+ AiModule = _ts_decorate23([
2348
+ common.Global(),
2349
+ common.Module({})
2350
+ ], AiModule);
2351
+
2352
+ // src/testing/testing.module.ts
2353
+ async function createTestingAiModule(options = {}) {
2354
+ const model = options.model ?? createMockModel("mock response");
2355
+ const embedding = options.embedding ?? createEmbeddingMock(() => [
2356
+ 0
2357
+ ]);
2358
+ const moduleRef = await testing.Test.createTestingModule({
2359
+ imports: [
2360
+ AiModule.forRoot(options.aiOptions ?? {
2361
+ providers: {
2362
+ openai: {
2363
+ apiKey: "test"
2364
+ }
2365
+ }
2366
+ }),
2367
+ ...options.imports ?? []
2368
+ ],
2369
+ providers: options.providers ?? []
2370
+ }).overrideProvider(ProviderRegistry).useValue({
2371
+ getLanguageModel: /* @__PURE__ */ __name(() => model, "getLanguageModel"),
2372
+ getEmbeddingModel: /* @__PURE__ */ __name(() => embedding, "getEmbeddingModel"),
2373
+ getImageModel: /* @__PURE__ */ __name(() => {
2374
+ throw new Error("No image model mock configured.");
2375
+ }, "getImageModel"),
2376
+ getSpeechModel: /* @__PURE__ */ __name(() => {
2377
+ throw new Error("No speech model mock configured.");
2378
+ }, "getSpeechModel"),
2379
+ getTranscriptionModel: /* @__PURE__ */ __name(() => {
2380
+ throw new Error("No transcription model mock configured.");
2381
+ }, "getTranscriptionModel"),
2382
+ getRerankingModel: /* @__PURE__ */ __name(() => {
2383
+ throw new Error("No reranking model mock configured.");
2384
+ }, "getRerankingModel")
2385
+ }).compile();
2386
+ await moduleRef.init();
2387
+ return moduleRef;
2388
+ }
2389
+ __name(createTestingAiModule, "createTestingAiModule");
2390
+
2391
+ exports.createEmbeddingMock = createEmbeddingMock;
2392
+ exports.createMockModel = createMockModel;
2393
+ exports.createTestingAiModule = createTestingAiModule;
2394
+ //# sourceMappingURL=testing.cjs.map
2395
+ //# sourceMappingURL=testing.cjs.map