@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
package/dist/index.js ADDED
@@ -0,0 +1,3163 @@
1
+ import 'reflect-metadata';
2
+ import { Injectable, Inject, Optional, Global, Module } from '@nestjs/common';
3
+ import { DiscoveryService, MetadataScanner, Reflector, DiscoveryModule, ModuleRef } from '@nestjs/core';
4
+ import { wrapLanguageModel, tool, generateText, streamText, generateObject, streamObject, embed, embedMany, stepCountIs, generateImage, experimental_generateSpeech, experimental_transcribe, cosineSimilarity, dynamicTool, jsonSchema, rerank } from 'ai';
5
+ import { z } from 'zod';
6
+ import { mergeMap, EMPTY } from 'rxjs';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+
11
+ // src/ai.constants.ts
12
+ var AI_MODULE_OPTIONS = /* @__PURE__ */ Symbol("AI_MODULE_OPTIONS");
13
+ var CONVERSATION_STORE = /* @__PURE__ */ Symbol("CONVERSATION_STORE");
14
+ var VECTOR_STORE = /* @__PURE__ */ Symbol("VECTOR_STORE");
15
+ var AI_CACHE = /* @__PURE__ */ Symbol("AI_CACHE");
16
+ var APPROVAL_GATE = /* @__PURE__ */ Symbol("APPROVAL_GATE");
17
+ var AGENT_QUEUE = /* @__PURE__ */ Symbol("AGENT_QUEUE");
18
+ var RATE_LIMITER = /* @__PURE__ */ Symbol("RATE_LIMITER");
19
+ var RERANKER = /* @__PURE__ */ Symbol("RERANKER");
20
+ var TOOL_METADATA = /* @__PURE__ */ Symbol("nestjs-ai:tool");
21
+ var AGENT_METADATA = /* @__PURE__ */ Symbol("nestjs-ai:agent");
22
+ var GUARDRAIL_METADATA = /* @__PURE__ */ Symbol("nestjs-ai:guardrail");
23
+ var DEFAULT_MAX_STEPS = 5;
24
+
25
+ // src/resilience/fallback-model.ts
26
+ function createFallbackModel(models, options = {}) {
27
+ if (models.length === 0) {
28
+ throw new Error("createFallbackModel requires at least one model.");
29
+ }
30
+ const primary = models[0];
31
+ const shouldRetry = options.shouldRetry ?? (() => true);
32
+ async function attempt(call) {
33
+ let lastError;
34
+ for (let i = 0; i < models.length; i++) {
35
+ try {
36
+ return await call(models[i]);
37
+ } catch (error) {
38
+ lastError = error;
39
+ const isLast = i === models.length - 1;
40
+ if (isLast || !shouldRetry(error)) {
41
+ throw error;
42
+ }
43
+ }
44
+ }
45
+ throw lastError;
46
+ }
47
+ __name(attempt, "attempt");
48
+ return {
49
+ specificationVersion: "v3",
50
+ provider: options.provider ?? `fallback(${primary.provider})`,
51
+ modelId: primary.modelId,
52
+ get supportedUrls() {
53
+ return primary.supportedUrls;
54
+ },
55
+ doGenerate: /* @__PURE__ */ __name((callOptions) => attempt((model) => model.doGenerate(callOptions)), "doGenerate"),
56
+ doStream: /* @__PURE__ */ __name((callOptions) => attempt((model) => model.doStream(callOptions)), "doStream")
57
+ };
58
+ }
59
+ __name(createFallbackModel, "createFallbackModel");
60
+
61
+ // src/cache/cache-middleware.ts
62
+ function createCacheMiddleware(cache, options = {}) {
63
+ return {
64
+ async wrapGenerate({ doGenerate, params, model }) {
65
+ const key = cacheKey(model.modelId, params);
66
+ const cached = await cache.get(key);
67
+ if (cached !== void 0) {
68
+ return cached;
69
+ }
70
+ const result = await doGenerate();
71
+ await cache.set(key, result, options.ttlMs);
72
+ return result;
73
+ }
74
+ };
75
+ }
76
+ __name(createCacheMiddleware, "createCacheMiddleware");
77
+ function cacheKey(modelId, params) {
78
+ return `${modelId}:${stableStringify(params)}`;
79
+ }
80
+ __name(cacheKey, "cacheKey");
81
+ function stableStringify(value) {
82
+ return JSON.stringify(value, (_key, val) => {
83
+ if (val && typeof val === "object" && !Array.isArray(val)) {
84
+ return Object.keys(val).sort().reduce((acc, k) => {
85
+ acc[k] = val[k];
86
+ return acc;
87
+ }, {});
88
+ }
89
+ return val;
90
+ });
91
+ }
92
+ __name(stableStringify, "stableStringify");
93
+
94
+ // src/core/provider-registry.ts
95
+ function _ts_decorate(decorators, target, key, desc) {
96
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
97
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
98
+ 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;
99
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
100
+ }
101
+ __name(_ts_decorate, "_ts_decorate");
102
+ function _ts_metadata(k, v) {
103
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
104
+ }
105
+ __name(_ts_metadata, "_ts_metadata");
106
+ function _ts_param(paramIndex, decorator) {
107
+ return function(target, key) {
108
+ decorator(target, key, paramIndex);
109
+ };
110
+ }
111
+ __name(_ts_param, "_ts_param");
112
+ var ProviderRegistry = class {
113
+ static {
114
+ __name(this, "ProviderRegistry");
115
+ }
116
+ options;
117
+ cache;
118
+ providers = /* @__PURE__ */ new Map();
119
+ constructor(options, cache) {
120
+ this.options = options;
121
+ this.cache = cache;
122
+ }
123
+ /** Wraps a model with the cache middleware when a cache is configured. */
124
+ applyCache(model) {
125
+ if (!this.cache || typeof model === "string") {
126
+ return model;
127
+ }
128
+ return wrapLanguageModel({
129
+ model,
130
+ middleware: createCacheMiddleware(this.cache, {
131
+ ttlMs: this.options.cacheTtlMs
132
+ })
133
+ });
134
+ }
135
+ async onModuleInit() {
136
+ const configured = this.options.providers ?? {};
137
+ for (const name of Object.keys(configured)) {
138
+ const config = configured[name];
139
+ if (config) {
140
+ await this.initProvider(name, config);
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Resolves a language model. Accepts a `LanguageModel` instance (returned
146
+ * as-is), a `"provider:model"` string, a bare `"model"` string (using the
147
+ * default provider), or `undefined` (using `defaultModel`).
148
+ */
149
+ getLanguageModel(model) {
150
+ const chain = model ?? this.options.defaultModel;
151
+ if (Array.isArray(chain)) {
152
+ if (chain.length === 0) {
153
+ throw new Error("An empty model array was provided.");
154
+ }
155
+ if (chain.length === 1) {
156
+ return this.getLanguageModel(chain[0]);
157
+ }
158
+ const resolved = chain.map((m) => this.resolveSingle(m));
159
+ return this.applyCache(createFallbackModel(resolved));
160
+ }
161
+ return this.applyCache(this.resolveSingle(chain));
162
+ }
163
+ /** Resolves a single (non-array) model reference without cache wrapping. */
164
+ resolveSingle(model) {
165
+ if (model && typeof model !== "string") {
166
+ return model;
167
+ }
168
+ const { provider, modelId } = this.resolve(model, void 0);
169
+ return provider.languageModel(modelId);
170
+ }
171
+ /**
172
+ * Resolves an embedding model from a `"provider:model"` string, a bare model
173
+ * string, an `EmbeddingModel` instance, or `undefined` (using
174
+ * `defaultEmbeddingModel`).
175
+ */
176
+ getEmbeddingModel(model) {
177
+ if (model && typeof model !== "string") {
178
+ return model;
179
+ }
180
+ const { name, provider, modelId } = this.resolve(model, this.options.defaultEmbeddingModel);
181
+ if (typeof provider.textEmbeddingModel !== "function") {
182
+ throw new Error(`Provider "${name}" does not support embeddings. Configure a provider with embedding support (e.g. openai or google).`);
183
+ }
184
+ return provider.textEmbeddingModel(modelId);
185
+ }
186
+ /** Resolves an image-generation model (default `defaultImageModel`). */
187
+ getImageModel(model) {
188
+ if (model && typeof model !== "string") {
189
+ return model;
190
+ }
191
+ return this.resolveMultimodal(model, this.options.defaultImageModel, [
192
+ "imageModel",
193
+ "image"
194
+ ], "image generation");
195
+ }
196
+ /** Resolves a reranking model (default `rerankingModel` option). */
197
+ getRerankingModel(model) {
198
+ if (model && typeof model !== "string") {
199
+ return model;
200
+ }
201
+ return this.resolveMultimodal(model, this.options.rerankingModel, [
202
+ "rerankingModel",
203
+ "reranking"
204
+ ], "reranking");
205
+ }
206
+ /** Resolves a speech (text-to-speech) model (default `defaultSpeechModel`). */
207
+ getSpeechModel(model) {
208
+ if (model && typeof model !== "string") {
209
+ return model;
210
+ }
211
+ return this.resolveMultimodal(model, this.options.defaultSpeechModel, [
212
+ "speechModel",
213
+ "speech"
214
+ ], "speech");
215
+ }
216
+ /** Resolves a transcription (speech-to-text) model. */
217
+ getTranscriptionModel(model) {
218
+ if (model && typeof model !== "string") {
219
+ return model;
220
+ }
221
+ return this.resolveMultimodal(model, this.options.defaultTranscriptionModel, [
222
+ "transcriptionModel",
223
+ "transcription"
224
+ ], "transcription");
225
+ }
226
+ /**
227
+ * Shared resolution for multimodal models: resolves the provider, then calls
228
+ * the first available factory method (standard name, then shorthand).
229
+ */
230
+ resolveMultimodal(model, fallback, methods, capability) {
231
+ const { name, provider, modelId } = this.resolve(model, fallback);
232
+ for (const method of methods) {
233
+ const fn = provider[method];
234
+ if (typeof fn === "function") {
235
+ return fn.call(provider, modelId);
236
+ }
237
+ }
238
+ throw new Error(`Provider "${name}" does not support ${capability}. Configure a provider that does (e.g. openai).`);
239
+ }
240
+ resolve(model, fallback) {
241
+ const raw = model ?? fallback;
242
+ if (!raw) {
243
+ throw new Error("No model specified and no default model configured. Pass a model id or set `defaultModel` in AiModule options.");
244
+ }
245
+ const name = this.parseProviderName(raw);
246
+ const modelId = this.parseModelId(raw);
247
+ const provider = this.providers.get(name);
248
+ if (!provider) {
249
+ throw new Error(`Provider "${name}" is not configured. Add it to AiModule \`providers\` options and install \`@ai-sdk/${name}\`.`);
250
+ }
251
+ return {
252
+ name,
253
+ provider,
254
+ modelId
255
+ };
256
+ }
257
+ parseProviderName(raw) {
258
+ const sep = raw.indexOf(":");
259
+ if (sep !== -1) {
260
+ return raw.slice(0, sep);
261
+ }
262
+ if (this.providers.size === 1) {
263
+ return this.providers.keys().next().value;
264
+ }
265
+ const def = this.options.defaultModel;
266
+ if (def && def.includes(":")) {
267
+ return def.slice(0, def.indexOf(":"));
268
+ }
269
+ throw new Error(`Cannot infer provider for model "${raw}". Prefix it as "provider:model" (e.g. "openai:${raw}").`);
270
+ }
271
+ parseModelId(raw) {
272
+ const sep = raw.indexOf(":");
273
+ return sep !== -1 ? raw.slice(sep + 1) : raw;
274
+ }
275
+ async initProvider(name, config) {
276
+ const settings = {
277
+ apiKey: config.apiKey,
278
+ baseURL: config.baseURL,
279
+ headers: config.headers
280
+ };
281
+ try {
282
+ switch (name) {
283
+ case "openai": {
284
+ const { createOpenAI } = await import('@ai-sdk/openai');
285
+ this.providers.set(name, createOpenAI(settings));
286
+ break;
287
+ }
288
+ case "anthropic": {
289
+ const { createAnthropic } = await import('@ai-sdk/anthropic');
290
+ this.providers.set(name, createAnthropic(settings));
291
+ break;
292
+ }
293
+ case "google": {
294
+ const { createGoogleGenerativeAI } = await import('@ai-sdk/google');
295
+ this.providers.set(name, createGoogleGenerativeAI(settings));
296
+ break;
297
+ }
298
+ default: {
299
+ throw new Error(`Unknown provider "${name}".`);
300
+ }
301
+ }
302
+ } catch (error) {
303
+ if (error instanceof Error && /Cannot find|find module/i.test(error.message)) {
304
+ throw new Error(`Provider "${name}" is configured but the package "@ai-sdk/${name}" is not installed. Run \`npm install @ai-sdk/${name}\`.`);
305
+ }
306
+ throw error;
307
+ }
308
+ }
309
+ };
310
+ ProviderRegistry = _ts_decorate([
311
+ Injectable(),
312
+ _ts_param(0, Inject(AI_MODULE_OPTIONS)),
313
+ _ts_param(1, Optional()),
314
+ _ts_param(1, Inject(AI_CACHE)),
315
+ _ts_metadata("design:type", Function),
316
+ _ts_metadata("design:paramtypes", [
317
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions,
318
+ typeof AiCache === "undefined" ? Object : AiCache
319
+ ])
320
+ ], ProviderRegistry);
321
+ function _ts_decorate2(decorators, target, key, desc) {
322
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
323
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
324
+ 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;
325
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
326
+ }
327
+ __name(_ts_decorate2, "_ts_decorate");
328
+ function _ts_metadata2(k, v) {
329
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
330
+ }
331
+ __name(_ts_metadata2, "_ts_metadata");
332
+ function _ts_param2(paramIndex, decorator) {
333
+ return function(target, key) {
334
+ decorator(target, key, paramIndex);
335
+ };
336
+ }
337
+ __name(_ts_param2, "_ts_param");
338
+ var EVENT_EMITTER = /* @__PURE__ */ Symbol("AI_EVENT_EMITTER");
339
+ var AiEventEmitter = class {
340
+ static {
341
+ __name(this, "AiEventEmitter");
342
+ }
343
+ emitter;
344
+ constructor(emitter) {
345
+ this.emitter = emitter;
346
+ }
347
+ emit(event, payload) {
348
+ this.emitter?.emit(event, payload);
349
+ }
350
+ /** Whether an underlying emitter is wired up. */
351
+ get enabled() {
352
+ return this.emitter != null;
353
+ }
354
+ };
355
+ AiEventEmitter = _ts_decorate2([
356
+ Injectable(),
357
+ _ts_param2(0, Optional()),
358
+ _ts_param2(0, Inject(EVENT_EMITTER)),
359
+ _ts_metadata2("design:type", Function),
360
+ _ts_metadata2("design:paramtypes", [
361
+ Object
362
+ ])
363
+ ], AiEventEmitter);
364
+
365
+ // src/observability/ai-events.ts
366
+ var AI_EVENTS = {
367
+ agentRunStart: "ai.agent.run.start",
368
+ agentRunFinish: "ai.agent.run.finish",
369
+ agentRunError: "ai.agent.run.error",
370
+ toolCall: "ai.tool.call",
371
+ toolResult: "ai.tool.result",
372
+ streamFinish: "ai.stream.finish",
373
+ usage: "ai.usage"
374
+ };
375
+ function _ts_decorate3(decorators, target, key, desc) {
376
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
377
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
378
+ 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;
379
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
380
+ }
381
+ __name(_ts_decorate3, "_ts_decorate");
382
+ function _ts_metadata3(k, v) {
383
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
384
+ }
385
+ __name(_ts_metadata3, "_ts_metadata");
386
+ var GuardrailRegistry = class {
387
+ static {
388
+ __name(this, "GuardrailRegistry");
389
+ }
390
+ discovery;
391
+ guardrails = [];
392
+ constructor(discovery) {
393
+ this.discovery = discovery;
394
+ }
395
+ onModuleInit() {
396
+ for (const wrapper of this.discovery.getProviders()) {
397
+ const instance = wrapper.instance;
398
+ const ctor = instance?.constructor;
399
+ if (instance && ctor && Reflect.getMetadata(GUARDRAIL_METADATA, ctor) === true) {
400
+ this.guardrails.push(instance);
401
+ }
402
+ }
403
+ }
404
+ get count() {
405
+ return this.guardrails.length;
406
+ }
407
+ async runBeforeRun(ctx) {
408
+ for (const guardrail of this.guardrails) {
409
+ await guardrail.beforeRun?.(ctx);
410
+ }
411
+ }
412
+ async runAfterRun(ctx, result) {
413
+ for (const guardrail of this.guardrails) {
414
+ await guardrail.afterRun?.(ctx, result);
415
+ }
416
+ }
417
+ async runOnToolCall(tool4, args) {
418
+ for (const guardrail of this.guardrails) {
419
+ await guardrail.onToolCall?.(tool4, args);
420
+ }
421
+ }
422
+ };
423
+ GuardrailRegistry = _ts_decorate3([
424
+ Injectable(),
425
+ _ts_metadata3("design:type", Function),
426
+ _ts_metadata3("design:paramtypes", [
427
+ typeof DiscoveryService === "undefined" ? Object : DiscoveryService
428
+ ])
429
+ ], GuardrailRegistry);
430
+ function _ts_decorate4(decorators, target, key, desc) {
431
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
432
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
433
+ 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;
434
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
435
+ }
436
+ __name(_ts_decorate4, "_ts_decorate");
437
+ function _ts_metadata4(k, v) {
438
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
439
+ }
440
+ __name(_ts_metadata4, "_ts_metadata");
441
+ var AgentRegistry = class {
442
+ static {
443
+ __name(this, "AgentRegistry");
444
+ }
445
+ discovery;
446
+ agents = /* @__PURE__ */ new Map();
447
+ constructor(discovery) {
448
+ this.discovery = discovery;
449
+ }
450
+ onModuleInit() {
451
+ for (const wrapper of this.discovery.getProviders()) {
452
+ const instance = wrapper.instance;
453
+ const ctor = instance?.constructor;
454
+ if (instance && ctor && Reflect.getMetadata(AGENT_METADATA, ctor)) {
455
+ this.agents.set(ctor.name, {
456
+ name: ctor.name,
457
+ instance,
458
+ target: ctor
459
+ });
460
+ }
461
+ }
462
+ }
463
+ /** Returns an agent instance by class name. */
464
+ get(name) {
465
+ return this.agents.get(name)?.instance;
466
+ }
467
+ /** Returns an agent instance by its class. */
468
+ getByClass(target) {
469
+ return this.agents.get(target.name)?.instance;
470
+ }
471
+ /** All discovered agents. */
472
+ all() {
473
+ return [
474
+ ...this.agents.values()
475
+ ];
476
+ }
477
+ };
478
+ AgentRegistry = _ts_decorate4([
479
+ Injectable(),
480
+ _ts_metadata4("design:type", Function),
481
+ _ts_metadata4("design:paramtypes", [
482
+ typeof DiscoveryService === "undefined" ? Object : DiscoveryService
483
+ ])
484
+ ], AgentRegistry);
485
+ function createAgentTool(agent, options = {}) {
486
+ const schema = options.inputSchema ?? z.object({
487
+ input: z.string().describe("The task or question for the agent")
488
+ });
489
+ return tool({
490
+ description: options.description ?? `Delegate the task to the ${options.name ?? "sub"} agent.`,
491
+ inputSchema: schema,
492
+ execute: /* @__PURE__ */ __name(async (args) => {
493
+ const input = typeof args === "string" ? args : args?.input ?? JSON.stringify(args);
494
+ const result = await agent.run(input);
495
+ return result.text;
496
+ }, "execute")
497
+ });
498
+ }
499
+ __name(createAgentTool, "createAgentTool");
500
+
501
+ // src/approval/approval-gate.interface.ts
502
+ var ToolApprovalDeniedError = class extends Error {
503
+ static {
504
+ __name(this, "ToolApprovalDeniedError");
505
+ }
506
+ tool;
507
+ constructor(tool4) {
508
+ super(`Tool "${tool4}" was denied by the approval gate.`), this.tool = tool4;
509
+ this.name = "ToolApprovalDeniedError";
510
+ }
511
+ };
512
+
513
+ // src/tools/tool.registry.ts
514
+ function _ts_decorate5(decorators, target, key, desc) {
515
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
516
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
517
+ 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;
518
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
519
+ }
520
+ __name(_ts_decorate5, "_ts_decorate");
521
+ function _ts_metadata5(k, v) {
522
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
523
+ }
524
+ __name(_ts_metadata5, "_ts_metadata");
525
+ function _ts_param3(paramIndex, decorator) {
526
+ return function(target, key) {
527
+ decorator(target, key, paramIndex);
528
+ };
529
+ }
530
+ __name(_ts_param3, "_ts_param");
531
+ var ToolRegistry = class {
532
+ static {
533
+ __name(this, "ToolRegistry");
534
+ }
535
+ discovery;
536
+ scanner;
537
+ reflector;
538
+ events;
539
+ guardrails;
540
+ approvalGate;
541
+ agentRegistry;
542
+ tools = /* @__PURE__ */ new Map();
543
+ constructor(discovery, scanner, reflector, events, guardrails, approvalGate, agentRegistry) {
544
+ this.discovery = discovery;
545
+ this.scanner = scanner;
546
+ this.reflector = reflector;
547
+ this.events = events;
548
+ this.guardrails = guardrails;
549
+ this.approvalGate = approvalGate;
550
+ this.agentRegistry = agentRegistry;
551
+ }
552
+ onModuleInit() {
553
+ for (const wrapper of this.discovery.getProviders()) {
554
+ const instance = wrapper.instance;
555
+ if (!instance || typeof instance !== "object") {
556
+ continue;
557
+ }
558
+ const prototype = Object.getPrototypeOf(instance);
559
+ if (!prototype) {
560
+ continue;
561
+ }
562
+ for (const methodName of this.scanner.getAllMethodNames(prototype)) {
563
+ const methodRef = instance[methodName];
564
+ const metadata = this.reflector.get(TOOL_METADATA, methodRef);
565
+ if (!metadata) {
566
+ continue;
567
+ }
568
+ this.register(instance, methodName, metadata);
569
+ }
570
+ }
571
+ }
572
+ register(instance, methodName, metadata) {
573
+ const name = metadata.name ?? methodName;
574
+ if (this.tools.has(name)) {
575
+ throw new Error(`Duplicate AI tool name "${name}". Tool names must be unique across all providers (declared on ${instance.constructor?.name}).`);
576
+ }
577
+ const built = tool({
578
+ description: metadata.description,
579
+ inputSchema: metadata.schema,
580
+ execute: /* @__PURE__ */ __name(async (args, opts) => {
581
+ if (metadata.requiresApproval && this.approvalGate) {
582
+ const approved = await this.approvalGate.requestApproval({
583
+ tool: name,
584
+ args
585
+ });
586
+ if (!approved) {
587
+ throw new ToolApprovalDeniedError(name);
588
+ }
589
+ }
590
+ await this.guardrails?.runOnToolCall(name, args);
591
+ this.events?.emit(AI_EVENTS.toolCall, {
592
+ tool: name,
593
+ args
594
+ });
595
+ const result = await instance[methodName](args, opts);
596
+ this.events?.emit(AI_EVENTS.toolResult, {
597
+ tool: name,
598
+ args,
599
+ result
600
+ });
601
+ return result;
602
+ }, "execute")
603
+ });
604
+ this.tools.set(name, {
605
+ name,
606
+ tool: built,
607
+ target: instance.constructor
608
+ });
609
+ }
610
+ /** Returns the tool registered under `name`, if any. */
611
+ getByName(name) {
612
+ return this.tools.get(name);
613
+ }
614
+ /** Returns every tool declared by the given provider class. */
615
+ getForClass(target) {
616
+ return [
617
+ ...this.tools.values()
618
+ ].filter((entry) => entry.target === target);
619
+ }
620
+ /** Returns all discovered tools. */
621
+ getAll() {
622
+ return [
623
+ ...this.tools.values()
624
+ ];
625
+ }
626
+ /**
627
+ * Builds the `ToolSet` passed to `generateText`/`streamText` from a list of
628
+ * tool references (provider classes and/or tool names). Passing no refs
629
+ * returns every discovered tool.
630
+ */
631
+ buildToolSet(refs) {
632
+ const entries = refs && refs.length > 0 ? refs.flatMap((ref) => this.resolveRef(ref)) : this.getAll();
633
+ const set = {};
634
+ for (const entry of entries) {
635
+ set[entry.name] = entry.tool;
636
+ }
637
+ return set;
638
+ }
639
+ resolveRef(ref) {
640
+ if (typeof ref === "string") {
641
+ const entry = this.getByName(ref);
642
+ if (!entry) {
643
+ throw new Error(`Unknown AI tool "${ref}".`);
644
+ }
645
+ return [
646
+ entry
647
+ ];
648
+ }
649
+ const entries = this.getForClass(ref);
650
+ if (entries.length > 0) {
651
+ return entries;
652
+ }
653
+ const agentEntry = this.resolveAgentRef(ref);
654
+ if (agentEntry) {
655
+ return [
656
+ agentEntry
657
+ ];
658
+ }
659
+ 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.`);
660
+ }
661
+ resolveAgentRef(ref) {
662
+ if (!this.agentRegistry || !Reflect.getMetadata(AGENT_METADATA, ref)) {
663
+ return void 0;
664
+ }
665
+ const instance = this.agentRegistry.getByClass(ref);
666
+ if (!instance) {
667
+ return void 0;
668
+ }
669
+ return {
670
+ name: ref.name,
671
+ tool: createAgentTool(instance, {
672
+ name: ref.name
673
+ }),
674
+ target: ref
675
+ };
676
+ }
677
+ };
678
+ ToolRegistry = _ts_decorate5([
679
+ Injectable(),
680
+ _ts_param3(3, Optional()),
681
+ _ts_param3(4, Optional()),
682
+ _ts_param3(5, Optional()),
683
+ _ts_param3(5, Inject(APPROVAL_GATE)),
684
+ _ts_param3(6, Optional()),
685
+ _ts_metadata5("design:type", Function),
686
+ _ts_metadata5("design:paramtypes", [
687
+ typeof DiscoveryService === "undefined" ? Object : DiscoveryService,
688
+ typeof MetadataScanner === "undefined" ? Object : MetadataScanner,
689
+ typeof Reflector === "undefined" ? Object : Reflector,
690
+ typeof AiEventEmitter === "undefined" ? Object : AiEventEmitter,
691
+ typeof GuardrailRegistry === "undefined" ? Object : GuardrailRegistry,
692
+ typeof ApprovalGate === "undefined" ? Object : ApprovalGate,
693
+ typeof AgentRegistry === "undefined" ? Object : AgentRegistry
694
+ ])
695
+ ], ToolRegistry);
696
+
697
+ // src/core/ai.service.ts
698
+ function _ts_decorate6(decorators, target, key, desc) {
699
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
700
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
701
+ 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;
702
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
703
+ }
704
+ __name(_ts_decorate6, "_ts_decorate");
705
+ function _ts_metadata6(k, v) {
706
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
707
+ }
708
+ __name(_ts_metadata6, "_ts_metadata");
709
+ var AiService = class {
710
+ static {
711
+ __name(this, "AiService");
712
+ }
713
+ providers;
714
+ toolRegistry;
715
+ constructor(providers, toolRegistry) {
716
+ this.providers = providers;
717
+ this.toolRegistry = toolRegistry;
718
+ }
719
+ generateText(params) {
720
+ return generateText(this.resolve(params));
721
+ }
722
+ streamText(params) {
723
+ return streamText(this.resolve(params));
724
+ }
725
+ generateObject(params) {
726
+ return generateObject(this.resolve(params));
727
+ }
728
+ streamObject(params) {
729
+ return streamObject(this.resolve(params));
730
+ }
731
+ resolve(params) {
732
+ const { model, tools, ...rest } = params;
733
+ return {
734
+ ...rest,
735
+ model: this.providers.getLanguageModel(model),
736
+ ...tools ? {
737
+ tools: this.toolRegistry.buildToolSet(tools)
738
+ } : {}
739
+ };
740
+ }
741
+ };
742
+ AiService = _ts_decorate6([
743
+ Injectable(),
744
+ _ts_metadata6("design:type", Function),
745
+ _ts_metadata6("design:paramtypes", [
746
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
747
+ typeof ToolRegistry === "undefined" ? Object : ToolRegistry
748
+ ])
749
+ ], AiService);
750
+
751
+ // src/messages/message.types.ts
752
+ function toMessages(input) {
753
+ if (typeof input === "string") {
754
+ return [
755
+ {
756
+ role: "user",
757
+ content: input
758
+ }
759
+ ];
760
+ }
761
+ return input;
762
+ }
763
+ __name(toMessages, "toMessages");
764
+
765
+ // src/prompts/prompt.types.ts
766
+ var PLACEHOLDER = /\{\{\s*([\w.]+)\s*\}\}/g;
767
+ function interpolate(template, vars = {}) {
768
+ return template.replace(PLACEHOLDER, (_match, key) => {
769
+ if (!(key in vars)) {
770
+ throw new Error(`Missing variable "${key}" for prompt interpolation.`);
771
+ }
772
+ const value = vars[key];
773
+ return value == null ? "" : String(value);
774
+ });
775
+ }
776
+ __name(interpolate, "interpolate");
777
+
778
+ // src/prompts/prompt-registry.service.ts
779
+ function _ts_decorate7(decorators, target, key, desc) {
780
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
781
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
782
+ 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;
783
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
784
+ }
785
+ __name(_ts_decorate7, "_ts_decorate");
786
+ var DEFAULT_VERSION = "__default__";
787
+ var PromptRegistry = class {
788
+ static {
789
+ __name(this, "PromptRegistry");
790
+ }
791
+ /** name -> (version -> definition) */
792
+ prompts = /* @__PURE__ */ new Map();
793
+ /** name -> most recently registered version key */
794
+ latest = /* @__PURE__ */ new Map();
795
+ /** Registers a prompt. Throws on a duplicate (name, version). */
796
+ register(definition) {
797
+ const versions = this.prompts.get(definition.name) ?? /* @__PURE__ */ new Map();
798
+ const versionKey = definition.version ?? DEFAULT_VERSION;
799
+ if (versions.has(versionKey)) {
800
+ throw new Error(`Prompt "${definition.name}"${definition.version ? ` version "${definition.version}"` : ""} is already registered.`);
801
+ }
802
+ versions.set(versionKey, definition);
803
+ this.prompts.set(definition.name, versions);
804
+ this.latest.set(definition.name, versionKey);
805
+ }
806
+ /** Registers many prompts. */
807
+ registerAll(definitions) {
808
+ for (const definition of definitions) {
809
+ this.register(definition);
810
+ }
811
+ }
812
+ /** Returns a prompt definition (latest version when `version` omitted). */
813
+ get(name, version) {
814
+ const versions = this.prompts.get(name);
815
+ if (!versions) {
816
+ throw new Error(`Unknown prompt "${name}".`);
817
+ }
818
+ const versionKey = version ?? this.latest.get(name) ?? DEFAULT_VERSION;
819
+ const definition = versions.get(versionKey);
820
+ if (!definition) {
821
+ throw new Error(`Unknown version "${version}" for prompt "${name}".`);
822
+ }
823
+ return definition;
824
+ }
825
+ /** Renders a prompt to a string, interpolating `{{var}}` placeholders. */
826
+ render(name, vars = {}, options = {}) {
827
+ return interpolate(this.get(name, options.version).template, vars);
828
+ }
829
+ /** Whether a prompt (any version) is registered. */
830
+ has(name) {
831
+ return this.prompts.has(name);
832
+ }
833
+ };
834
+ PromptRegistry = _ts_decorate7([
835
+ Injectable()
836
+ ], PromptRegistry);
837
+
838
+ // src/usage/pricing.ts
839
+ var DEFAULT_PRICING = {
840
+ "gpt-4o": {
841
+ input: 2.5,
842
+ output: 10
843
+ },
844
+ "gpt-4o-mini": {
845
+ input: 0.15,
846
+ output: 0.6
847
+ },
848
+ "gpt-4.1": {
849
+ input: 2,
850
+ output: 8
851
+ },
852
+ "gpt-4.1-mini": {
853
+ input: 0.4,
854
+ output: 1.6
855
+ },
856
+ "o3-mini": {
857
+ input: 1.1,
858
+ output: 4.4
859
+ },
860
+ "text-embedding-3-small": {
861
+ input: 0.02,
862
+ output: 0
863
+ },
864
+ "text-embedding-3-large": {
865
+ input: 0.13,
866
+ output: 0
867
+ },
868
+ "claude-sonnet-4": {
869
+ input: 3,
870
+ output: 15
871
+ },
872
+ "claude-opus-4": {
873
+ input: 15,
874
+ output: 75
875
+ },
876
+ "claude-haiku-4": {
877
+ input: 0.8,
878
+ output: 4
879
+ },
880
+ "gemini-2.5-pro": {
881
+ input: 1.25,
882
+ output: 10
883
+ },
884
+ "gemini-2.5-flash": {
885
+ input: 0.3,
886
+ output: 2.5
887
+ }
888
+ };
889
+ function bareModelId(modelId) {
890
+ const sep = modelId.indexOf(":");
891
+ return sep === -1 ? modelId : modelId.slice(sep + 1);
892
+ }
893
+ __name(bareModelId, "bareModelId");
894
+ function costOf(usage, modelId, pricing = DEFAULT_PRICING) {
895
+ const price = pricing[bareModelId(modelId)] ?? pricing[modelId];
896
+ if (!price) {
897
+ return 0;
898
+ }
899
+ const input = usage.inputTokens ?? 0;
900
+ const output = usage.outputTokens ?? 0;
901
+ return input / 1e6 * price.input + output / 1e6 * price.output;
902
+ }
903
+ __name(costOf, "costOf");
904
+
905
+ // src/usage/usage-tracker.service.ts
906
+ function _ts_decorate8(decorators, target, key, desc) {
907
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
908
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
909
+ 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;
910
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
911
+ }
912
+ __name(_ts_decorate8, "_ts_decorate");
913
+ function _ts_metadata7(k, v) {
914
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
915
+ }
916
+ __name(_ts_metadata7, "_ts_metadata");
917
+ function _ts_param4(paramIndex, decorator) {
918
+ return function(target, key) {
919
+ decorator(target, key, paramIndex);
920
+ };
921
+ }
922
+ __name(_ts_param4, "_ts_param");
923
+ var GLOBAL = "__global__";
924
+ function empty() {
925
+ return {
926
+ inputTokens: 0,
927
+ outputTokens: 0,
928
+ cost: 0,
929
+ runs: 0
930
+ };
931
+ }
932
+ __name(empty, "empty");
933
+ var UsageTracker = class {
934
+ static {
935
+ __name(this, "UsageTracker");
936
+ }
937
+ options;
938
+ events;
939
+ totalsByScope = /* @__PURE__ */ new Map();
940
+ constructor(options, events) {
941
+ this.options = options;
942
+ this.events = events;
943
+ }
944
+ /** Records a run's usage, returns the single-run record, emits `ai.usage`. */
945
+ record(entry) {
946
+ const usage = entry.usage ?? {};
947
+ const inputTokens = usage.inputTokens ?? 0;
948
+ const outputTokens = usage.outputTokens ?? 0;
949
+ const cost = costOf(usage, entry.model, this.options.pricing);
950
+ for (const scope of [
951
+ GLOBAL,
952
+ entry.conversationId
953
+ ].filter(Boolean)) {
954
+ const totals = this.totalsByScope.get(scope) ?? empty();
955
+ totals.inputTokens += inputTokens;
956
+ totals.outputTokens += outputTokens;
957
+ totals.cost += cost;
958
+ totals.runs += 1;
959
+ this.totalsByScope.set(scope, totals);
960
+ }
961
+ const record = {
962
+ conversationId: entry.conversationId,
963
+ agent: entry.agent,
964
+ model: entry.model,
965
+ inputTokens,
966
+ outputTokens,
967
+ cost,
968
+ runs: 1
969
+ };
970
+ this.events?.emit(AI_EVENTS.usage, record);
971
+ return record;
972
+ }
973
+ /** Totals for a conversation, or global totals when no id is given. */
974
+ totals(conversationId) {
975
+ return {
976
+ ...this.totalsByScope.get(conversationId ?? GLOBAL) ?? empty()
977
+ };
978
+ }
979
+ /** Clears totals for a conversation (or all when no id). */
980
+ reset(conversationId) {
981
+ if (conversationId) {
982
+ this.totalsByScope.delete(conversationId);
983
+ } else {
984
+ this.totalsByScope.clear();
985
+ }
986
+ }
987
+ };
988
+ UsageTracker = _ts_decorate8([
989
+ Injectable(),
990
+ _ts_param4(0, Inject(AI_MODULE_OPTIONS)),
991
+ _ts_param4(1, Optional()),
992
+ _ts_metadata7("design:type", Function),
993
+ _ts_metadata7("design:paramtypes", [
994
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions,
995
+ typeof AiEventEmitter === "undefined" ? Object : AiEventEmitter
996
+ ])
997
+ ], UsageTracker);
998
+ function _ts_decorate9(decorators, target, key, desc) {
999
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1000
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1001
+ 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;
1002
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1003
+ }
1004
+ __name(_ts_decorate9, "_ts_decorate");
1005
+ function _ts_metadata8(k, v) {
1006
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1007
+ }
1008
+ __name(_ts_metadata8, "_ts_metadata");
1009
+ function _ts_param5(paramIndex, decorator) {
1010
+ return function(target, key) {
1011
+ decorator(target, key, paramIndex);
1012
+ };
1013
+ }
1014
+ __name(_ts_param5, "_ts_param");
1015
+ var EmbeddingsService = class {
1016
+ static {
1017
+ __name(this, "EmbeddingsService");
1018
+ }
1019
+ providers;
1020
+ cache;
1021
+ constructor(providers, cache) {
1022
+ this.providers = providers;
1023
+ this.cache = cache;
1024
+ }
1025
+ /** Embeds a single value (cached when a cache is configured). */
1026
+ async embed(value, options = {}) {
1027
+ const model = this.providers.getEmbeddingModel(options.model);
1028
+ const key = `emb:${model.modelId ?? ""}:${value}`;
1029
+ if (this.cache) {
1030
+ const hit = await this.cache.get(key);
1031
+ if (hit !== void 0) {
1032
+ return hit;
1033
+ }
1034
+ }
1035
+ const result = await embed({
1036
+ model,
1037
+ value,
1038
+ abortSignal: options.abortSignal,
1039
+ maxRetries: options.maxRetries
1040
+ });
1041
+ if (this.cache) {
1042
+ await this.cache.set(key, result);
1043
+ }
1044
+ return result;
1045
+ }
1046
+ /** Embeds many values (the SDK batches automatically). */
1047
+ async embedMany(values, options = {}) {
1048
+ return embedMany({
1049
+ model: this.providers.getEmbeddingModel(options.model),
1050
+ values,
1051
+ abortSignal: options.abortSignal,
1052
+ maxRetries: options.maxRetries
1053
+ });
1054
+ }
1055
+ };
1056
+ EmbeddingsService = _ts_decorate9([
1057
+ Injectable(),
1058
+ _ts_param5(1, Optional()),
1059
+ _ts_param5(1, Inject(AI_CACHE)),
1060
+ _ts_metadata8("design:type", Function),
1061
+ _ts_metadata8("design:paramtypes", [
1062
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
1063
+ typeof AiCache === "undefined" ? Object : AiCache
1064
+ ])
1065
+ ], EmbeddingsService);
1066
+
1067
+ // src/memory/semantic/semantic-memory.service.ts
1068
+ function _ts_decorate10(decorators, target, key, desc) {
1069
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1070
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1071
+ 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;
1072
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1073
+ }
1074
+ __name(_ts_decorate10, "_ts_decorate");
1075
+ function _ts_metadata9(k, v) {
1076
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1077
+ }
1078
+ __name(_ts_metadata9, "_ts_metadata");
1079
+ function _ts_param6(paramIndex, decorator) {
1080
+ return function(target, key) {
1081
+ decorator(target, key, paramIndex);
1082
+ };
1083
+ }
1084
+ __name(_ts_param6, "_ts_param");
1085
+ var SemanticMemory = class {
1086
+ static {
1087
+ __name(this, "SemanticMemory");
1088
+ }
1089
+ embeddings;
1090
+ store;
1091
+ ai;
1092
+ constructor(embeddings, store, ai) {
1093
+ this.embeddings = embeddings;
1094
+ this.store = store;
1095
+ this.ai = ai;
1096
+ }
1097
+ /** Embeds and stores a snippet under a conversation. */
1098
+ async remember(conversationId, text, options = {}) {
1099
+ const { embedding } = await this.embeddings.embed(text, {
1100
+ model: options.model
1101
+ });
1102
+ await this.store.upsert([
1103
+ {
1104
+ id: `mem:${conversationId}:${hash(text)}`,
1105
+ content: text,
1106
+ embedding,
1107
+ metadata: {
1108
+ conversationId,
1109
+ kind: "memory",
1110
+ ...options.metadata
1111
+ }
1112
+ }
1113
+ ]);
1114
+ }
1115
+ /** Returns the most relevant stored snippets for a query. */
1116
+ async recall(conversationId, query, options = {}) {
1117
+ const { embedding } = await this.embeddings.embed(query, {
1118
+ model: options.model
1119
+ });
1120
+ return this.store.query(embedding, {
1121
+ topK: options.topK ?? 4,
1122
+ filter: {
1123
+ conversationId,
1124
+ kind: "memory"
1125
+ }
1126
+ });
1127
+ }
1128
+ /**
1129
+ * Summarizes messages with the LLM (requires `AiService`), then stores the
1130
+ * summary as a memory snippet. Returns the stored text.
1131
+ */
1132
+ async rememberConversation(conversationId, input, options = {}) {
1133
+ const text = options.summarize ? await this.summarize(input, options.model) : messagesToText(input);
1134
+ await this.remember(conversationId, text, {
1135
+ model: options.model
1136
+ });
1137
+ return text;
1138
+ }
1139
+ /** Summarizes messages into a compact string via the LLM. */
1140
+ async summarize(input, model) {
1141
+ if (!this.ai) {
1142
+ throw new Error("SemanticMemory.summarize requires AiService.");
1143
+ }
1144
+ const { text } = await this.ai.generateText({
1145
+ model,
1146
+ prompt: `Summarize the following conversation concisely:
1147
+
1148
+ ${messagesToText(input)}`
1149
+ });
1150
+ return text;
1151
+ }
1152
+ };
1153
+ SemanticMemory = _ts_decorate10([
1154
+ Injectable(),
1155
+ _ts_param6(1, Inject(VECTOR_STORE)),
1156
+ _ts_param6(2, Optional()),
1157
+ _ts_metadata9("design:type", Function),
1158
+ _ts_metadata9("design:paramtypes", [
1159
+ typeof EmbeddingsService === "undefined" ? Object : EmbeddingsService,
1160
+ typeof VectorStore === "undefined" ? Object : VectorStore,
1161
+ typeof AiService === "undefined" ? Object : AiService
1162
+ ])
1163
+ ], SemanticMemory);
1164
+ function messagesToText(input) {
1165
+ return toMessages(input).map((m) => {
1166
+ const content = m.content;
1167
+ if (typeof content === "string") {
1168
+ return `${m.role}: ${content}`;
1169
+ }
1170
+ if (Array.isArray(content)) {
1171
+ return `${m.role}: ${content.map((p) => p && typeof p.text === "string" ? p.text : "").join(" ")}`;
1172
+ }
1173
+ return "";
1174
+ }).join("\n");
1175
+ }
1176
+ __name(messagesToText, "messagesToText");
1177
+ function hash(text) {
1178
+ let h = 5381;
1179
+ for (let i = 0; i < text.length; i++) {
1180
+ h = h * 33 ^ text.charCodeAt(i);
1181
+ }
1182
+ return (h >>> 0).toString(36);
1183
+ }
1184
+ __name(hash, "hash");
1185
+
1186
+ // src/agent/agent-executor.service.ts
1187
+ function _ts_decorate11(decorators, target, key, desc) {
1188
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1189
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1190
+ 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;
1191
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1192
+ }
1193
+ __name(_ts_decorate11, "_ts_decorate");
1194
+ function _ts_metadata10(k, v) {
1195
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1196
+ }
1197
+ __name(_ts_metadata10, "_ts_metadata");
1198
+ function _ts_param7(paramIndex, decorator) {
1199
+ return function(target, key) {
1200
+ decorator(target, key, paramIndex);
1201
+ };
1202
+ }
1203
+ __name(_ts_param7, "_ts_param");
1204
+ var AgentExecutorService = class {
1205
+ static {
1206
+ __name(this, "AgentExecutorService");
1207
+ }
1208
+ providers;
1209
+ toolRegistry;
1210
+ store;
1211
+ options;
1212
+ events;
1213
+ guardrails;
1214
+ prompts;
1215
+ usageTracker;
1216
+ semanticMemory;
1217
+ constructor(providers, toolRegistry, store, options, events, guardrails, prompts, usageTracker, semanticMemory) {
1218
+ this.providers = providers;
1219
+ this.toolRegistry = toolRegistry;
1220
+ this.store = store;
1221
+ this.options = options;
1222
+ this.events = events;
1223
+ this.guardrails = guardrails;
1224
+ this.prompts = prompts;
1225
+ this.usageTracker = usageTracker;
1226
+ this.semanticMemory = semanticMemory;
1227
+ }
1228
+ /** Runs an agent to completion and returns its result. */
1229
+ async run(agent, input, opts = {}) {
1230
+ const meta = this.readMetadata(agent);
1231
+ const agentName = agent.constructor?.name ?? "AiAgent";
1232
+ const model = this.providers.getLanguageModel(opts.model ?? meta.model);
1233
+ const system = await this.resolveSystemWithRecall(opts, meta, input);
1234
+ const schema = opts.schema ?? meta.output;
1235
+ const maxSteps = this.resolveMaxSteps(opts, meta);
1236
+ const newMessages = toMessages(input);
1237
+ const history = await this.loadHistory(opts.conversationId);
1238
+ const ctx = {
1239
+ agent: agentName,
1240
+ messages: [
1241
+ ...history,
1242
+ ...newMessages
1243
+ ],
1244
+ options: opts
1245
+ };
1246
+ this.events?.emit(AI_EVENTS.agentRunStart, {
1247
+ agent: agentName,
1248
+ input,
1249
+ options: opts
1250
+ });
1251
+ try {
1252
+ await this.guardrails?.runBeforeRun(ctx);
1253
+ const result = schema ? await this.runObject(model, system, ctx.messages, schema, opts, newMessages) : await this.runText(model, system, ctx.messages, meta, maxSteps, opts, newMessages);
1254
+ this.usageTracker?.record({
1255
+ model: model.modelId ?? "unknown",
1256
+ usage: result.usage,
1257
+ conversationId: opts.conversationId,
1258
+ agent: agentName
1259
+ });
1260
+ await this.guardrails?.runAfterRun(ctx, result);
1261
+ this.events?.emit(AI_EVENTS.agentRunFinish, {
1262
+ agent: agentName,
1263
+ result
1264
+ });
1265
+ return result;
1266
+ } catch (error) {
1267
+ this.events?.emit(AI_EVENTS.agentRunError, {
1268
+ agent: agentName,
1269
+ error
1270
+ });
1271
+ throw error;
1272
+ }
1273
+ }
1274
+ async runObject(model, system, messages, schema, opts, newMessages) {
1275
+ const result = await generateObject({
1276
+ model,
1277
+ system,
1278
+ messages,
1279
+ schema,
1280
+ abortSignal: opts.abortSignal,
1281
+ temperature: opts.temperature,
1282
+ maxRetries: opts.maxRetries ?? this.options.maxRetries,
1283
+ experimental_telemetry: this.telemetry()
1284
+ });
1285
+ await this.persist(opts.conversationId, newMessages, [
1286
+ {
1287
+ role: "assistant",
1288
+ content: JSON.stringify(result.object)
1289
+ }
1290
+ ]);
1291
+ return {
1292
+ text: "",
1293
+ object: result.object,
1294
+ usage: result.usage,
1295
+ finishReason: result.finishReason,
1296
+ messages: []
1297
+ };
1298
+ }
1299
+ async runText(model, system, messages, meta, maxSteps, opts, newMessages) {
1300
+ const result = await generateText({
1301
+ model,
1302
+ system,
1303
+ messages,
1304
+ tools: this.toolRegistry.buildToolSet(meta.tools),
1305
+ stopWhen: stepCountIs(maxSteps),
1306
+ abortSignal: opts.abortSignal,
1307
+ temperature: opts.temperature,
1308
+ maxRetries: opts.maxRetries ?? this.options.maxRetries,
1309
+ experimental_telemetry: this.telemetry()
1310
+ });
1311
+ await this.persist(opts.conversationId, newMessages, result.response.messages);
1312
+ return {
1313
+ text: result.text,
1314
+ steps: result.steps,
1315
+ toolCalls: result.toolCalls,
1316
+ usage: result.totalUsage,
1317
+ finishReason: result.finishReason,
1318
+ messages: result.response.messages
1319
+ };
1320
+ }
1321
+ /**
1322
+ * Streams an agent's response. Returns the raw Vercel stream result so
1323
+ * controllers can pipe it to an HTTP response or iterate `textStream`.
1324
+ * Conversation persistence happens on stream finish.
1325
+ */
1326
+ stream(agent, input, opts = {}) {
1327
+ const meta = this.readMetadata(agent);
1328
+ const agentName = agent.constructor?.name ?? "AiAgent";
1329
+ const model = this.providers.getLanguageModel(opts.model ?? meta.model);
1330
+ const system = this.resolveSystem(opts, meta);
1331
+ const schema = opts.schema ?? meta.output;
1332
+ const maxSteps = this.resolveMaxSteps(opts, meta);
1333
+ const newMessages = toMessages(input);
1334
+ this.events?.emit(AI_EVENTS.agentRunStart, {
1335
+ agent: agentName,
1336
+ input,
1337
+ options: opts
1338
+ });
1339
+ if (schema) {
1340
+ return streamObject({
1341
+ model,
1342
+ system,
1343
+ messages: newMessages,
1344
+ schema,
1345
+ abortSignal: opts.abortSignal,
1346
+ temperature: opts.temperature,
1347
+ experimental_telemetry: this.telemetry(),
1348
+ onFinish: /* @__PURE__ */ __name(async ({ object }) => {
1349
+ if (object !== void 0) {
1350
+ await this.persist(opts.conversationId, newMessages, [
1351
+ {
1352
+ role: "assistant",
1353
+ content: JSON.stringify(object)
1354
+ }
1355
+ ]);
1356
+ }
1357
+ this.events?.emit(AI_EVENTS.streamFinish, {
1358
+ agent: agentName
1359
+ });
1360
+ }, "onFinish")
1361
+ });
1362
+ }
1363
+ return streamText({
1364
+ model,
1365
+ system,
1366
+ messages: newMessages,
1367
+ tools: this.toolRegistry.buildToolSet(meta.tools),
1368
+ stopWhen: stepCountIs(maxSteps),
1369
+ abortSignal: opts.abortSignal,
1370
+ temperature: opts.temperature,
1371
+ maxRetries: opts.maxRetries ?? this.options.maxRetries,
1372
+ experimental_telemetry: this.telemetry(),
1373
+ onFinish: /* @__PURE__ */ __name(async ({ response }) => {
1374
+ await this.persist(opts.conversationId, newMessages, response.messages);
1375
+ this.events?.emit(AI_EVENTS.streamFinish, {
1376
+ agent: agentName
1377
+ });
1378
+ }, "onFinish")
1379
+ });
1380
+ }
1381
+ /** Resolves the system prompt and prepends recalled memory when requested. */
1382
+ async resolveSystemWithRecall(opts, meta, input) {
1383
+ let system = this.resolveSystem(opts, meta);
1384
+ if (opts.recall && opts.conversationId && this.semanticMemory) {
1385
+ const query = opts.recall.query ?? (typeof input === "string" ? input : "");
1386
+ if (query) {
1387
+ const snippets = await this.semanticMemory.recall(opts.conversationId, query, {
1388
+ topK: opts.recall.topK
1389
+ });
1390
+ if (snippets.length > 0) {
1391
+ const context = snippets.map((s) => s.content).join("\n");
1392
+ system = [
1393
+ system,
1394
+ `Relevant context from memory:
1395
+ ${context}`
1396
+ ].filter(Boolean).join("\n\n");
1397
+ }
1398
+ }
1399
+ }
1400
+ return system;
1401
+ }
1402
+ resolveSystem(opts, meta) {
1403
+ if (opts.systemPrompt) {
1404
+ if (!this.prompts) {
1405
+ throw new Error("systemPrompt requires the PromptRegistry (AiModule must be imported).");
1406
+ }
1407
+ return this.prompts.render(opts.systemPrompt.name, opts.systemPrompt.vars, {
1408
+ version: opts.systemPrompt.version
1409
+ });
1410
+ }
1411
+ return opts.system ?? meta.system;
1412
+ }
1413
+ telemetry() {
1414
+ const t = this.options.telemetry;
1415
+ if (!t?.isEnabled) {
1416
+ return void 0;
1417
+ }
1418
+ return {
1419
+ isEnabled: true,
1420
+ functionId: t.functionId
1421
+ };
1422
+ }
1423
+ readMetadata(agent) {
1424
+ const ctor = agent.constructor;
1425
+ return Reflect.getMetadata(AGENT_METADATA, ctor) ?? {};
1426
+ }
1427
+ resolveMaxSteps(opts, meta) {
1428
+ return opts.maxSteps ?? meta.maxSteps ?? this.options.defaultMaxSteps ?? DEFAULT_MAX_STEPS;
1429
+ }
1430
+ async loadHistory(conversationId) {
1431
+ if (!conversationId) {
1432
+ return [];
1433
+ }
1434
+ return this.store.load(conversationId);
1435
+ }
1436
+ async persist(conversationId, userMessages, responseMessages) {
1437
+ if (!conversationId) {
1438
+ return;
1439
+ }
1440
+ await this.store.append(conversationId, [
1441
+ ...userMessages,
1442
+ ...responseMessages
1443
+ ]);
1444
+ }
1445
+ };
1446
+ AgentExecutorService = _ts_decorate11([
1447
+ Injectable(),
1448
+ _ts_param7(2, Inject(CONVERSATION_STORE)),
1449
+ _ts_param7(3, Inject(AI_MODULE_OPTIONS)),
1450
+ _ts_param7(4, Optional()),
1451
+ _ts_param7(5, Optional()),
1452
+ _ts_param7(6, Optional()),
1453
+ _ts_param7(7, Optional()),
1454
+ _ts_param7(8, Optional()),
1455
+ _ts_metadata10("design:type", Function),
1456
+ _ts_metadata10("design:paramtypes", [
1457
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
1458
+ typeof ToolRegistry === "undefined" ? Object : ToolRegistry,
1459
+ typeof ConversationStore === "undefined" ? Object : ConversationStore,
1460
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions,
1461
+ typeof AiEventEmitter === "undefined" ? Object : AiEventEmitter,
1462
+ typeof GuardrailRegistry === "undefined" ? Object : GuardrailRegistry,
1463
+ typeof PromptRegistry === "undefined" ? Object : PromptRegistry,
1464
+ typeof UsageTracker === "undefined" ? Object : UsageTracker,
1465
+ typeof SemanticMemory === "undefined" ? Object : SemanticMemory
1466
+ ])
1467
+ ], AgentExecutorService);
1468
+ function _ts_decorate12(decorators, target, key, desc) {
1469
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1470
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1471
+ 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;
1472
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1473
+ }
1474
+ __name(_ts_decorate12, "_ts_decorate");
1475
+ var InMemoryConversationStore = class {
1476
+ static {
1477
+ __name(this, "InMemoryConversationStore");
1478
+ }
1479
+ conversations = /* @__PURE__ */ new Map();
1480
+ async load(conversationId) {
1481
+ return [
1482
+ ...this.conversations.get(conversationId) ?? []
1483
+ ];
1484
+ }
1485
+ async append(conversationId, messages) {
1486
+ const existing = this.conversations.get(conversationId) ?? [];
1487
+ this.conversations.set(conversationId, [
1488
+ ...existing,
1489
+ ...messages
1490
+ ]);
1491
+ }
1492
+ async clear(conversationId) {
1493
+ this.conversations.delete(conversationId);
1494
+ }
1495
+ };
1496
+ InMemoryConversationStore = _ts_decorate12([
1497
+ Injectable()
1498
+ ], InMemoryConversationStore);
1499
+ function _ts_decorate13(decorators, target, key, desc) {
1500
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1501
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1502
+ 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;
1503
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1504
+ }
1505
+ __name(_ts_decorate13, "_ts_decorate");
1506
+ function _ts_metadata11(k, v) {
1507
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1508
+ }
1509
+ __name(_ts_metadata11, "_ts_metadata");
1510
+ var ImageService = class {
1511
+ static {
1512
+ __name(this, "ImageService");
1513
+ }
1514
+ providers;
1515
+ constructor(providers) {
1516
+ this.providers = providers;
1517
+ }
1518
+ generate(prompt, options = {}) {
1519
+ const { model, ...rest } = options;
1520
+ return generateImage({
1521
+ model: this.providers.getImageModel(model),
1522
+ prompt,
1523
+ ...rest
1524
+ });
1525
+ }
1526
+ };
1527
+ ImageService = _ts_decorate13([
1528
+ Injectable(),
1529
+ _ts_metadata11("design:type", Function),
1530
+ _ts_metadata11("design:paramtypes", [
1531
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry
1532
+ ])
1533
+ ], ImageService);
1534
+ function _ts_decorate14(decorators, target, key, desc) {
1535
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1536
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1537
+ 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;
1538
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1539
+ }
1540
+ __name(_ts_decorate14, "_ts_decorate");
1541
+ function _ts_metadata12(k, v) {
1542
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1543
+ }
1544
+ __name(_ts_metadata12, "_ts_metadata");
1545
+ var SpeechService = class {
1546
+ static {
1547
+ __name(this, "SpeechService");
1548
+ }
1549
+ providers;
1550
+ constructor(providers) {
1551
+ this.providers = providers;
1552
+ }
1553
+ generate(text, options = {}) {
1554
+ const { model, ...rest } = options;
1555
+ return experimental_generateSpeech({
1556
+ model: this.providers.getSpeechModel(model),
1557
+ text,
1558
+ ...rest
1559
+ });
1560
+ }
1561
+ };
1562
+ SpeechService = _ts_decorate14([
1563
+ Injectable(),
1564
+ _ts_metadata12("design:type", Function),
1565
+ _ts_metadata12("design:paramtypes", [
1566
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry
1567
+ ])
1568
+ ], SpeechService);
1569
+ function _ts_decorate15(decorators, target, key, desc) {
1570
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1571
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1572
+ 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;
1573
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1574
+ }
1575
+ __name(_ts_decorate15, "_ts_decorate");
1576
+ function _ts_metadata13(k, v) {
1577
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1578
+ }
1579
+ __name(_ts_metadata13, "_ts_metadata");
1580
+ var TranscriptionService = class {
1581
+ static {
1582
+ __name(this, "TranscriptionService");
1583
+ }
1584
+ providers;
1585
+ constructor(providers) {
1586
+ this.providers = providers;
1587
+ }
1588
+ transcribe(audio, options = {}) {
1589
+ const { model, ...rest } = options;
1590
+ return experimental_transcribe({
1591
+ model: this.providers.getTranscriptionModel(model),
1592
+ audio,
1593
+ ...rest
1594
+ });
1595
+ }
1596
+ };
1597
+ TranscriptionService = _ts_decorate15([
1598
+ Injectable(),
1599
+ _ts_metadata13("design:type", Function),
1600
+ _ts_metadata13("design:paramtypes", [
1601
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry
1602
+ ])
1603
+ ], TranscriptionService);
1604
+ function _ts_decorate16(decorators, target, key, desc) {
1605
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1606
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1607
+ 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;
1608
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1609
+ }
1610
+ __name(_ts_decorate16, "_ts_decorate");
1611
+ function _ts_metadata14(k, v) {
1612
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1613
+ }
1614
+ __name(_ts_metadata14, "_ts_metadata");
1615
+ function _ts_param8(paramIndex, decorator) {
1616
+ return function(target, key) {
1617
+ decorator(target, key, paramIndex);
1618
+ };
1619
+ }
1620
+ __name(_ts_param8, "_ts_param");
1621
+ var RagService = class {
1622
+ static {
1623
+ __name(this, "RagService");
1624
+ }
1625
+ embeddings;
1626
+ store;
1627
+ defaultReranker;
1628
+ constructor(embeddings, store, defaultReranker) {
1629
+ this.embeddings = embeddings;
1630
+ this.store = store;
1631
+ this.defaultReranker = defaultReranker;
1632
+ }
1633
+ /** Chunks, embeds, and upserts items into the vector store. */
1634
+ async ingest(items, options = {}) {
1635
+ const chunkSize = options.chunkSize ?? 1e3;
1636
+ const overlap2 = options.chunkOverlap ?? 100;
1637
+ const chunks = [];
1638
+ items.forEach((item, index) => {
1639
+ const baseId = item.id ?? `doc-${index}`;
1640
+ splitText(item.content, chunkSize, overlap2).forEach((text, chunkIndex) => {
1641
+ chunks.push({
1642
+ id: `${baseId}#${chunkIndex}`,
1643
+ content: text,
1644
+ metadata: item.metadata
1645
+ });
1646
+ });
1647
+ });
1648
+ if (chunks.length === 0) {
1649
+ return;
1650
+ }
1651
+ const { embeddings } = await this.embeddings.embedMany(chunks.map((c) => c.content), {
1652
+ model: options.model
1653
+ });
1654
+ const documents = chunks.map((chunk, i) => ({
1655
+ ...chunk,
1656
+ embedding: embeddings[i]
1657
+ }));
1658
+ await this.store.upsert(documents);
1659
+ }
1660
+ /** Embeds `query` and returns the most similar stored chunks. */
1661
+ async retrieve(query, options = {}) {
1662
+ const { embedding } = await this.embeddings.embed(query, {
1663
+ model: options.model
1664
+ });
1665
+ const topK = options.topK ?? 4;
1666
+ const reranker = options.rerank === true ? this.defaultReranker : options.rerank || void 0;
1667
+ const fetchK = reranker ? options.fetchK ?? topK * 4 : topK;
1668
+ const results = await this.store.query(embedding, {
1669
+ topK: fetchK,
1670
+ filter: options.filter
1671
+ });
1672
+ if (reranker) {
1673
+ return reranker.rerank(query, results, topK);
1674
+ }
1675
+ return results.slice(0, topK);
1676
+ }
1677
+ };
1678
+ RagService = _ts_decorate16([
1679
+ Injectable(),
1680
+ _ts_param8(1, Inject(VECTOR_STORE)),
1681
+ _ts_param8(2, Optional()),
1682
+ _ts_param8(2, Inject(RERANKER)),
1683
+ _ts_metadata14("design:type", Function),
1684
+ _ts_metadata14("design:paramtypes", [
1685
+ typeof EmbeddingsService === "undefined" ? Object : EmbeddingsService,
1686
+ typeof VectorStore === "undefined" ? Object : VectorStore,
1687
+ typeof Reranker === "undefined" ? Object : Reranker
1688
+ ])
1689
+ ], RagService);
1690
+ function splitText(text, chunkSize, overlap2) {
1691
+ if (chunkSize <= 0 || text.length <= chunkSize) {
1692
+ return text.length > 0 ? [
1693
+ text
1694
+ ] : [];
1695
+ }
1696
+ const step = Math.max(1, chunkSize - overlap2);
1697
+ const chunks = [];
1698
+ for (let start = 0; start < text.length; start += step) {
1699
+ chunks.push(text.slice(start, start + chunkSize));
1700
+ if (start + chunkSize >= text.length) {
1701
+ break;
1702
+ }
1703
+ }
1704
+ return chunks;
1705
+ }
1706
+ __name(splitText, "splitText");
1707
+ function _ts_decorate17(decorators, target, key, desc) {
1708
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1709
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1710
+ 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;
1711
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1712
+ }
1713
+ __name(_ts_decorate17, "_ts_decorate");
1714
+ var InMemoryVectorStore = class {
1715
+ static {
1716
+ __name(this, "InMemoryVectorStore");
1717
+ }
1718
+ documents = /* @__PURE__ */ new Map();
1719
+ async upsert(documents) {
1720
+ for (const doc of documents) {
1721
+ if (!doc.embedding) {
1722
+ throw new Error(`Document "${doc.id}" has no embedding. InMemoryVectorStore requires precomputed embeddings (use RagService.ingest).`);
1723
+ }
1724
+ this.documents.set(doc.id, doc);
1725
+ }
1726
+ }
1727
+ async query(embedding, options = {}) {
1728
+ const topK = options.topK ?? 4;
1729
+ const filter = options.filter;
1730
+ const scored = [];
1731
+ for (const doc of this.documents.values()) {
1732
+ if (filter && !this.matchesFilter(doc, filter)) {
1733
+ continue;
1734
+ }
1735
+ scored.push({
1736
+ id: doc.id,
1737
+ content: doc.content,
1738
+ score: cosineSimilarity(embedding, doc.embedding),
1739
+ metadata: doc.metadata
1740
+ });
1741
+ }
1742
+ return scored.sort((a, b) => b.score - a.score).slice(0, topK);
1743
+ }
1744
+ async delete(ids) {
1745
+ for (const id of ids) {
1746
+ this.documents.delete(id);
1747
+ }
1748
+ }
1749
+ async clear() {
1750
+ this.documents.clear();
1751
+ }
1752
+ matchesFilter(doc, filter) {
1753
+ return Object.entries(filter).every(([key, value]) => doc.metadata?.[key] === value);
1754
+ }
1755
+ };
1756
+ InMemoryVectorStore = _ts_decorate17([
1757
+ Injectable()
1758
+ ], InMemoryVectorStore);
1759
+ function _ts_decorate18(decorators, target, key, desc) {
1760
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1761
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1762
+ 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;
1763
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1764
+ }
1765
+ __name(_ts_decorate18, "_ts_decorate");
1766
+ var McpService = class {
1767
+ static {
1768
+ __name(this, "McpService");
1769
+ }
1770
+ clients = /* @__PURE__ */ new Map();
1771
+ toolSets = /* @__PURE__ */ new Map();
1772
+ /**
1773
+ * Registers an MCP client under `name`, lists its tools, and builds a
1774
+ * matching AI SDK tool set. Returns the tool set.
1775
+ */
1776
+ async connect(name, client) {
1777
+ const { tools } = await client.listTools();
1778
+ const set = {};
1779
+ for (const info of tools) {
1780
+ set[info.name] = dynamicTool({
1781
+ description: info.description ?? info.name,
1782
+ inputSchema: jsonSchema(info.inputSchema),
1783
+ execute: /* @__PURE__ */ __name(async (args) => {
1784
+ const result = await client.callTool({
1785
+ name: info.name,
1786
+ arguments: args ?? {}
1787
+ });
1788
+ return extractText(result);
1789
+ }, "execute")
1790
+ });
1791
+ }
1792
+ this.clients.set(name, client);
1793
+ this.toolSets.set(name, set);
1794
+ return set;
1795
+ }
1796
+ /** Returns the tool set for a connected server (empty if unknown). */
1797
+ getToolSet(name) {
1798
+ return this.toolSets.get(name) ?? {};
1799
+ }
1800
+ /** Returns tool sets for all connected servers, merged. */
1801
+ getAllTools() {
1802
+ return Object.assign({}, ...this.toolSets.values());
1803
+ }
1804
+ async onModuleDestroy() {
1805
+ await this.closeAll();
1806
+ }
1807
+ /** Closes every connected client. */
1808
+ async closeAll() {
1809
+ for (const client of this.clients.values()) {
1810
+ await client.close?.();
1811
+ }
1812
+ this.clients.clear();
1813
+ this.toolSets.clear();
1814
+ }
1815
+ };
1816
+ McpService = _ts_decorate18([
1817
+ Injectable()
1818
+ ], McpService);
1819
+ function extractText(result) {
1820
+ if (!result.content) {
1821
+ return "";
1822
+ }
1823
+ return result.content.filter((part) => part.type === "text" && typeof part.text === "string").map((part) => part.text).join("\n");
1824
+ }
1825
+ __name(extractText, "extractText");
1826
+ function Guardrail() {
1827
+ return (target) => {
1828
+ Reflect.defineMetadata(GUARDRAIL_METADATA, true, target);
1829
+ Injectable()(target);
1830
+ };
1831
+ }
1832
+ __name(Guardrail, "Guardrail");
1833
+
1834
+ // src/usage/budget.guardrail.ts
1835
+ function _ts_decorate19(decorators, target, key, desc) {
1836
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1837
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1838
+ 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;
1839
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1840
+ }
1841
+ __name(_ts_decorate19, "_ts_decorate");
1842
+ function _ts_metadata15(k, v) {
1843
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1844
+ }
1845
+ __name(_ts_metadata15, "_ts_metadata");
1846
+ function _ts_param9(paramIndex, decorator) {
1847
+ return function(target, key) {
1848
+ decorator(target, key, paramIndex);
1849
+ };
1850
+ }
1851
+ __name(_ts_param9, "_ts_param");
1852
+ var BudgetExceededError = class extends Error {
1853
+ static {
1854
+ __name(this, "BudgetExceededError");
1855
+ }
1856
+ conversationId;
1857
+ spent;
1858
+ limit;
1859
+ constructor(conversationId, spent, limit) {
1860
+ super(`Budget exceeded${conversationId ? ` for "${conversationId}"` : ""}: $${spent.toFixed(4)} >= $${limit.toFixed(4)}.`), this.conversationId = conversationId, this.spent = spent, this.limit = limit;
1861
+ this.name = "BudgetExceededError";
1862
+ }
1863
+ };
1864
+ var BudgetGuard = class {
1865
+ static {
1866
+ __name(this, "BudgetGuard");
1867
+ }
1868
+ usage;
1869
+ options;
1870
+ constructor(usage, options) {
1871
+ this.usage = usage;
1872
+ this.options = options;
1873
+ }
1874
+ beforeRun(ctx) {
1875
+ const limit = this.options.maxCostPerConversation;
1876
+ if (limit == null) {
1877
+ return;
1878
+ }
1879
+ const { cost } = this.usage.totals(ctx.options.conversationId);
1880
+ if (cost >= limit) {
1881
+ throw new BudgetExceededError(ctx.options.conversationId, cost, limit);
1882
+ }
1883
+ }
1884
+ };
1885
+ BudgetGuard = _ts_decorate19([
1886
+ Guardrail(),
1887
+ Injectable(),
1888
+ _ts_param9(1, Inject(AI_MODULE_OPTIONS)),
1889
+ _ts_metadata15("design:type", Function),
1890
+ _ts_metadata15("design:paramtypes", [
1891
+ typeof UsageTracker === "undefined" ? Object : UsageTracker,
1892
+ typeof AiModuleOptions === "undefined" ? Object : AiModuleOptions
1893
+ ])
1894
+ ], BudgetGuard);
1895
+
1896
+ // src/ratelimit/rate-limiter.interface.ts
1897
+ var RateLimitedError = class extends Error {
1898
+ static {
1899
+ __name(this, "RateLimitedError");
1900
+ }
1901
+ key;
1902
+ constructor(key) {
1903
+ super(`Rate limit exceeded for "${key}".`), this.key = key;
1904
+ this.name = "RateLimitedError";
1905
+ }
1906
+ };
1907
+
1908
+ // src/ratelimit/rate-limit.guardrail.ts
1909
+ function _ts_decorate20(decorators, target, key, desc) {
1910
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1911
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1912
+ 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;
1913
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1914
+ }
1915
+ __name(_ts_decorate20, "_ts_decorate");
1916
+ function _ts_metadata16(k, v) {
1917
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1918
+ }
1919
+ __name(_ts_metadata16, "_ts_metadata");
1920
+ function _ts_param10(paramIndex, decorator) {
1921
+ return function(target, key) {
1922
+ decorator(target, key, paramIndex);
1923
+ };
1924
+ }
1925
+ __name(_ts_param10, "_ts_param");
1926
+ var RateLimitGuardrail = class {
1927
+ static {
1928
+ __name(this, "RateLimitGuardrail");
1929
+ }
1930
+ limiter;
1931
+ constructor(limiter) {
1932
+ this.limiter = limiter;
1933
+ }
1934
+ async beforeRun(ctx) {
1935
+ const key = ctx.options.conversationId ?? "global";
1936
+ const allowed = await this.limiter.consume(key);
1937
+ if (!allowed) {
1938
+ throw new RateLimitedError(key);
1939
+ }
1940
+ }
1941
+ };
1942
+ RateLimitGuardrail = _ts_decorate20([
1943
+ Guardrail(),
1944
+ Injectable(),
1945
+ _ts_param10(0, Inject(RATE_LIMITER)),
1946
+ _ts_metadata16("design:type", Function),
1947
+ _ts_metadata16("design:paramtypes", [
1948
+ typeof RateLimiter === "undefined" ? Object : RateLimiter
1949
+ ])
1950
+ ], RateLimitGuardrail);
1951
+ function _ts_decorate21(decorators, target, key, desc) {
1952
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1953
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1954
+ 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;
1955
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1956
+ }
1957
+ __name(_ts_decorate21, "_ts_decorate");
1958
+ function _ts_metadata17(k, v) {
1959
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1960
+ }
1961
+ __name(_ts_metadata17, "_ts_metadata");
1962
+ function _ts_param11(paramIndex, decorator) {
1963
+ return function(target, key) {
1964
+ decorator(target, key, paramIndex);
1965
+ };
1966
+ }
1967
+ __name(_ts_param11, "_ts_param");
1968
+ var HeuristicReranker = class {
1969
+ static {
1970
+ __name(this, "HeuristicReranker");
1971
+ }
1972
+ options;
1973
+ constructor(options = {}) {
1974
+ this.options = options;
1975
+ }
1976
+ async rerank(query, results, topN) {
1977
+ const weight = this.options.overlapWeight ?? 0.5;
1978
+ const terms = tokenize(query);
1979
+ return results.map((result) => ({
1980
+ result,
1981
+ score: result.score + weight * overlap(terms, result.content)
1982
+ })).sort((a, b) => b.score - a.score).slice(0, topN).map(({ result, score }) => ({
1983
+ ...result,
1984
+ score
1985
+ }));
1986
+ }
1987
+ };
1988
+ HeuristicReranker = _ts_decorate21([
1989
+ Injectable(),
1990
+ _ts_param11(0, Optional()),
1991
+ _ts_metadata17("design:type", Function),
1992
+ _ts_metadata17("design:paramtypes", [
1993
+ typeof HeuristicRerankerOptions === "undefined" ? Object : HeuristicRerankerOptions
1994
+ ])
1995
+ ], HeuristicReranker);
1996
+ function tokenize(text) {
1997
+ return new Set(text.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 2));
1998
+ }
1999
+ __name(tokenize, "tokenize");
2000
+ function overlap(terms, content) {
2001
+ if (terms.size === 0) {
2002
+ return 0;
2003
+ }
2004
+ const contentTerms = tokenize(content);
2005
+ let hits = 0;
2006
+ for (const term of terms) {
2007
+ if (contentTerms.has(term)) {
2008
+ hits++;
2009
+ }
2010
+ }
2011
+ return hits / terms.size;
2012
+ }
2013
+ __name(overlap, "overlap");
2014
+ function _ts_decorate22(decorators, target, key, desc) {
2015
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2016
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2017
+ 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;
2018
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2019
+ }
2020
+ __name(_ts_decorate22, "_ts_decorate");
2021
+ var EvalRunner = class {
2022
+ static {
2023
+ __name(this, "EvalRunner");
2024
+ }
2025
+ async run(agent, cases, options = {}) {
2026
+ const judge = options.judge ?? defaultJudge(options.passThreshold ?? 1);
2027
+ const results = [];
2028
+ for (const evalCase of cases) {
2029
+ const { text } = await agent.run(evalCase.input);
2030
+ const score = await judge({
2031
+ case: evalCase,
2032
+ output: text
2033
+ });
2034
+ results.push({
2035
+ name: evalCase.name ?? evalCase.input,
2036
+ input: evalCase.input,
2037
+ output: text,
2038
+ ...score
2039
+ });
2040
+ }
2041
+ const averageScore = results.length ? results.reduce((sum, r) => sum + r.score, 0) / results.length : 0;
2042
+ const passRate = results.length ? results.filter((r) => r.passed).length / results.length : 0;
2043
+ return {
2044
+ results,
2045
+ averageScore,
2046
+ passRate
2047
+ };
2048
+ }
2049
+ };
2050
+ EvalRunner = _ts_decorate22([
2051
+ Injectable()
2052
+ ], EvalRunner);
2053
+ function defaultJudge(threshold) {
2054
+ return ({ case: evalCase, output }) => {
2055
+ if (evalCase.expected == null) {
2056
+ return {
2057
+ score: 0,
2058
+ passed: false,
2059
+ reasoning: "no expected value or judge"
2060
+ };
2061
+ }
2062
+ const score = output.includes(evalCase.expected) ? 1 : 0;
2063
+ return {
2064
+ score,
2065
+ passed: score >= threshold
2066
+ };
2067
+ };
2068
+ }
2069
+ __name(defaultJudge, "defaultJudge");
2070
+ function createLlmJudge(ai, options = {}) {
2071
+ const scale = options.scale ?? 5;
2072
+ const passThreshold = options.passThreshold ?? 0.6;
2073
+ return async ({ case: evalCase, output }) => {
2074
+ const { object } = await ai.generateObject({
2075
+ model: options.model,
2076
+ schema: z.object({
2077
+ score: z.number(),
2078
+ reasoning: z.string()
2079
+ }),
2080
+ prompt: `Rubric: ${evalCase.rubric ?? "Is the answer correct and helpful?"}
2081
+ Expected: ${evalCase.expected ?? "n/a"}
2082
+ Output: ${output}
2083
+ Give a score from 0 to ${scale} and a brief reasoning.`
2084
+ });
2085
+ const normalized = Math.max(0, Math.min(1, object.score / scale));
2086
+ return {
2087
+ score: normalized,
2088
+ passed: normalized >= passThreshold,
2089
+ reasoning: object.reasoning
2090
+ };
2091
+ };
2092
+ }
2093
+ __name(createLlmJudge, "createLlmJudge");
2094
+
2095
+ // src/ai.module.ts
2096
+ function _ts_decorate23(decorators, target, key, desc) {
2097
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2098
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2099
+ 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;
2100
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2101
+ }
2102
+ __name(_ts_decorate23, "_ts_decorate");
2103
+ var AI_INITIALIZER = /* @__PURE__ */ Symbol("AI_INITIALIZER");
2104
+ var AiModule = class _AiModule {
2105
+ static {
2106
+ __name(this, "AiModule");
2107
+ }
2108
+ /** Configure the module with static options. */
2109
+ static forRoot(options = {}) {
2110
+ return _AiModule.build({
2111
+ provide: AI_MODULE_OPTIONS,
2112
+ useValue: options
2113
+ }, options);
2114
+ }
2115
+ /** Configure the module asynchronously (e.g. from `ConfigService`). */
2116
+ static forRootAsync(options) {
2117
+ return _AiModule.build({
2118
+ provide: AI_MODULE_OPTIONS,
2119
+ useFactory: options.useFactory,
2120
+ inject: options.inject ?? []
2121
+ }, options, options.imports);
2122
+ }
2123
+ /**
2124
+ * Convenience registration of agents / tools / guardrails so they don't have
2125
+ * to be added to a consuming module's own `providers` array, plus feature
2126
+ * prompts. Discovery still finds providers globally regardless of where they
2127
+ * are registered.
2128
+ */
2129
+ static forFeature(feature = {}) {
2130
+ const providers = [
2131
+ ...feature.agents ?? [],
2132
+ ...feature.tools ?? [],
2133
+ ...feature.guardrails ?? []
2134
+ ];
2135
+ if (feature.prompts?.length) {
2136
+ providers.push({
2137
+ provide: /* @__PURE__ */ Symbol("AI_FEATURE_PROMPTS"),
2138
+ useFactory: /* @__PURE__ */ __name((registry) => {
2139
+ registry.registerAll(feature.prompts);
2140
+ return true;
2141
+ }, "useFactory"),
2142
+ inject: [
2143
+ PromptRegistry
2144
+ ]
2145
+ });
2146
+ }
2147
+ return {
2148
+ module: _AiModule,
2149
+ providers,
2150
+ exports: providers
2151
+ };
2152
+ }
2153
+ static build(optionsProvider, options, extraImports = []) {
2154
+ return {
2155
+ module: _AiModule,
2156
+ imports: [
2157
+ DiscoveryModule,
2158
+ ...extraImports ?? []
2159
+ ],
2160
+ providers: [
2161
+ optionsProvider,
2162
+ _AiModule.storeProvider(options.conversationStore),
2163
+ _AiModule.vectorStoreProvider(options.vectorStore),
2164
+ _AiModule.eventEmitterProvider(),
2165
+ ..._AiModule.tokenProvider(AI_CACHE, options.cache),
2166
+ ..._AiModule.tokenProvider(APPROVAL_GATE, options.approvalGate),
2167
+ ..._AiModule.tokenProvider(RATE_LIMITER, options.rateLimiter),
2168
+ ..._AiModule.guardrailClasses(options.guardrails),
2169
+ ...options.maxCostPerConversation != null ? [
2170
+ BudgetGuard
2171
+ ] : [],
2172
+ ...options.rateLimiter ? [
2173
+ RateLimitGuardrail
2174
+ ] : [],
2175
+ ..._AiModule.coreProviders(),
2176
+ _AiModule.initializerProvider()
2177
+ ],
2178
+ exports: _AiModule.exportedTokens()
2179
+ };
2180
+ }
2181
+ static coreProviders() {
2182
+ return [
2183
+ ProviderRegistry,
2184
+ ToolRegistry,
2185
+ AgentExecutorService,
2186
+ AgentRegistry,
2187
+ AiService,
2188
+ EmbeddingsService,
2189
+ ImageService,
2190
+ SpeechService,
2191
+ TranscriptionService,
2192
+ RagService,
2193
+ PromptRegistry,
2194
+ AiEventEmitter,
2195
+ GuardrailRegistry,
2196
+ McpService,
2197
+ UsageTracker,
2198
+ SemanticMemory,
2199
+ EvalRunner,
2200
+ {
2201
+ provide: RERANKER,
2202
+ useFactory: /* @__PURE__ */ __name(() => new HeuristicReranker(), "useFactory")
2203
+ }
2204
+ ];
2205
+ }
2206
+ /**
2207
+ * Registers an optional provider (class / factory / value / useClass shape)
2208
+ * under `token`, or nothing when not configured.
2209
+ */
2210
+ static tokenProvider(token, config) {
2211
+ if (!config) {
2212
+ return [];
2213
+ }
2214
+ if (typeof config === "function") {
2215
+ return [
2216
+ {
2217
+ provide: token,
2218
+ useClass: config
2219
+ }
2220
+ ];
2221
+ }
2222
+ return [
2223
+ {
2224
+ provide: token,
2225
+ ...config
2226
+ }
2227
+ ];
2228
+ }
2229
+ static exportedTokens() {
2230
+ return [
2231
+ ProviderRegistry,
2232
+ ToolRegistry,
2233
+ AgentExecutorService,
2234
+ AgentRegistry,
2235
+ AiService,
2236
+ EmbeddingsService,
2237
+ ImageService,
2238
+ SpeechService,
2239
+ TranscriptionService,
2240
+ RagService,
2241
+ PromptRegistry,
2242
+ AiEventEmitter,
2243
+ GuardrailRegistry,
2244
+ McpService,
2245
+ UsageTracker,
2246
+ SemanticMemory,
2247
+ EvalRunner,
2248
+ RERANKER,
2249
+ CONVERSATION_STORE,
2250
+ VECTOR_STORE,
2251
+ AI_MODULE_OPTIONS
2252
+ ];
2253
+ }
2254
+ static guardrailClasses(guardrails) {
2255
+ return guardrails ?? [];
2256
+ }
2257
+ /** Seeds prompts (and future startup wiring) once dependencies exist. */
2258
+ static initializerProvider() {
2259
+ return {
2260
+ provide: AI_INITIALIZER,
2261
+ useFactory: /* @__PURE__ */ __name((registry, opts) => {
2262
+ if (opts.prompts?.length) {
2263
+ registry.registerAll(opts.prompts);
2264
+ }
2265
+ return true;
2266
+ }, "useFactory"),
2267
+ inject: [
2268
+ PromptRegistry,
2269
+ AI_MODULE_OPTIONS
2270
+ ]
2271
+ };
2272
+ }
2273
+ /**
2274
+ * Optionally resolves `EventEmitter2` from `@nestjs/event-emitter` if the
2275
+ * package is installed and its module is imported; otherwise `undefined`.
2276
+ */
2277
+ static eventEmitterProvider() {
2278
+ return {
2279
+ provide: EVENT_EMITTER,
2280
+ useFactory: /* @__PURE__ */ __name(async (moduleRef) => {
2281
+ try {
2282
+ const mod = await import('@nestjs/event-emitter');
2283
+ return moduleRef.get(mod.EventEmitter2, {
2284
+ strict: false
2285
+ });
2286
+ } catch {
2287
+ return void 0;
2288
+ }
2289
+ }, "useFactory"),
2290
+ inject: [
2291
+ ModuleRef
2292
+ ]
2293
+ };
2294
+ }
2295
+ static storeProvider(store) {
2296
+ if (!store) {
2297
+ return {
2298
+ provide: CONVERSATION_STORE,
2299
+ useClass: InMemoryConversationStore
2300
+ };
2301
+ }
2302
+ if (typeof store === "function") {
2303
+ return {
2304
+ provide: CONVERSATION_STORE,
2305
+ useClass: store
2306
+ };
2307
+ }
2308
+ return {
2309
+ provide: CONVERSATION_STORE,
2310
+ ...store
2311
+ };
2312
+ }
2313
+ static vectorStoreProvider(store) {
2314
+ if (!store) {
2315
+ return {
2316
+ provide: VECTOR_STORE,
2317
+ useClass: InMemoryVectorStore
2318
+ };
2319
+ }
2320
+ if (typeof store === "function") {
2321
+ return {
2322
+ provide: VECTOR_STORE,
2323
+ useClass: store
2324
+ };
2325
+ }
2326
+ return {
2327
+ provide: VECTOR_STORE,
2328
+ ...store
2329
+ };
2330
+ }
2331
+ };
2332
+ AiModule = _ts_decorate23([
2333
+ Global(),
2334
+ Module({})
2335
+ ], AiModule);
2336
+ function Tool(options) {
2337
+ return (target, propertyKey, descriptor) => {
2338
+ const metadata = {
2339
+ ...options,
2340
+ methodName: String(propertyKey)
2341
+ };
2342
+ Reflect.defineMetadata(TOOL_METADATA, metadata, descriptor.value);
2343
+ return descriptor;
2344
+ };
2345
+ }
2346
+ __name(Tool, "Tool");
2347
+ function Agent(options = {}) {
2348
+ return (target) => {
2349
+ Reflect.defineMetadata(AGENT_METADATA, options, target);
2350
+ Injectable()(target);
2351
+ };
2352
+ }
2353
+ __name(Agent, "Agent");
2354
+ function _ts_decorate24(decorators, target, key, desc) {
2355
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2356
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2357
+ 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;
2358
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2359
+ }
2360
+ __name(_ts_decorate24, "_ts_decorate");
2361
+ function _ts_metadata18(k, v) {
2362
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2363
+ }
2364
+ __name(_ts_metadata18, "_ts_metadata");
2365
+ var AiAgent = class {
2366
+ static {
2367
+ __name(this, "AiAgent");
2368
+ }
2369
+ executor;
2370
+ /** Runs the agent to completion. */
2371
+ run(input, opts) {
2372
+ return this.executor.run(this, input, opts);
2373
+ }
2374
+ /** Streams the agent's response (returns the raw Vercel stream result). */
2375
+ stream(input, opts) {
2376
+ return this.executor.stream(this, input, opts);
2377
+ }
2378
+ };
2379
+ _ts_decorate24([
2380
+ Inject(AgentExecutorService),
2381
+ _ts_metadata18("design:type", typeof AgentExecutorService === "undefined" ? Object : AgentExecutorService)
2382
+ ], AiAgent.prototype, "executor", void 0);
2383
+ function createRetrievalTool(rag, options = {}) {
2384
+ return tool({
2385
+ description: options.description ?? "Search the knowledge base for information relevant to the query.",
2386
+ inputSchema: z.object({
2387
+ query: z.string().describe("The search query")
2388
+ }),
2389
+ execute: /* @__PURE__ */ __name(async ({ query }) => {
2390
+ const results = await rag.retrieve(query, {
2391
+ topK: options.topK,
2392
+ model: options.model,
2393
+ filter: options.filter
2394
+ });
2395
+ if (results.length === 0) {
2396
+ return "No relevant information found.";
2397
+ }
2398
+ return results.map((r, i) => `[${i + 1}] ${r.content}`).join("\n\n");
2399
+ }, "execute")
2400
+ });
2401
+ }
2402
+ __name(createRetrievalTool, "createRetrievalTool");
2403
+
2404
+ // src/memory/adapters/prisma/prisma-conversation.store.ts
2405
+ var PrismaConversationStore = class {
2406
+ static {
2407
+ __name(this, "PrismaConversationStore");
2408
+ }
2409
+ delegate;
2410
+ constructor(delegate) {
2411
+ this.delegate = delegate;
2412
+ }
2413
+ async load(conversationId) {
2414
+ const rows = await this.delegate.findMany({
2415
+ where: {
2416
+ conversationId
2417
+ },
2418
+ orderBy: {
2419
+ position: "asc"
2420
+ }
2421
+ });
2422
+ return rows.map((row) => ({
2423
+ role: row.role,
2424
+ content: row.content
2425
+ }));
2426
+ }
2427
+ async append(conversationId, messages) {
2428
+ if (messages.length === 0) {
2429
+ return;
2430
+ }
2431
+ const base = await this.delegate.count({
2432
+ where: {
2433
+ conversationId
2434
+ }
2435
+ });
2436
+ for (let index = 0; index < messages.length; index++) {
2437
+ const message = messages[index];
2438
+ await this.delegate.create({
2439
+ data: {
2440
+ conversationId,
2441
+ role: message.role,
2442
+ content: message.content,
2443
+ position: base + index
2444
+ }
2445
+ });
2446
+ }
2447
+ }
2448
+ async clear(conversationId) {
2449
+ await this.delegate.deleteMany({
2450
+ where: {
2451
+ conversationId
2452
+ }
2453
+ });
2454
+ }
2455
+ };
2456
+ function _ts_decorate25(decorators, target, key, desc) {
2457
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2458
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2459
+ 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;
2460
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2461
+ }
2462
+ __name(_ts_decorate25, "_ts_decorate");
2463
+ var InMemoryAiCache = class {
2464
+ static {
2465
+ __name(this, "InMemoryAiCache");
2466
+ }
2467
+ store = /* @__PURE__ */ new Map();
2468
+ async get(key) {
2469
+ const entry = this.store.get(key);
2470
+ if (!entry) {
2471
+ return void 0;
2472
+ }
2473
+ if (entry.expiresAt !== null && entry.expiresAt <= Date.now()) {
2474
+ this.store.delete(key);
2475
+ return void 0;
2476
+ }
2477
+ return entry.value;
2478
+ }
2479
+ async set(key, value, ttlMs) {
2480
+ this.store.set(key, {
2481
+ value,
2482
+ expiresAt: ttlMs != null ? Date.now() + ttlMs : null
2483
+ });
2484
+ }
2485
+ };
2486
+ InMemoryAiCache = _ts_decorate25([
2487
+ Injectable()
2488
+ ], InMemoryAiCache);
2489
+ function _ts_decorate26(decorators, target, key, desc) {
2490
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2491
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2492
+ 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;
2493
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2494
+ }
2495
+ __name(_ts_decorate26, "_ts_decorate");
2496
+ var AutoApproveGate = class {
2497
+ static {
2498
+ __name(this, "AutoApproveGate");
2499
+ }
2500
+ async requestApproval(_context) {
2501
+ return true;
2502
+ }
2503
+ };
2504
+ AutoApproveGate = _ts_decorate26([
2505
+ Injectable()
2506
+ ], AutoApproveGate);
2507
+ var DenyApproveGate = class {
2508
+ static {
2509
+ __name(this, "DenyApproveGate");
2510
+ }
2511
+ async requestApproval(_context) {
2512
+ return false;
2513
+ }
2514
+ };
2515
+ DenyApproveGate = _ts_decorate26([
2516
+ Injectable()
2517
+ ], DenyApproveGate);
2518
+
2519
+ // src/http/stream-response.ts
2520
+ function pipeAgentStream(result, res, options = {}) {
2521
+ const protocol = options.protocol ?? "ui";
2522
+ if (protocol === "text") {
2523
+ if (typeof result.pipeTextStreamToResponse === "function") {
2524
+ result.pipeTextStreamToResponse(res);
2525
+ return;
2526
+ }
2527
+ } else if (typeof result.pipeUIMessageStreamToResponse === "function") {
2528
+ result.pipeUIMessageStreamToResponse(res);
2529
+ return;
2530
+ }
2531
+ throw new Error(`The stream result does not support the "${protocol}" protocol.`);
2532
+ }
2533
+ __name(pipeAgentStream, "pipeAgentStream");
2534
+ function _ts_decorate27(decorators, target, key, desc) {
2535
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2536
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2537
+ 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;
2538
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2539
+ }
2540
+ __name(_ts_decorate27, "_ts_decorate");
2541
+ function _ts_metadata19(k, v) {
2542
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2543
+ }
2544
+ __name(_ts_metadata19, "_ts_metadata");
2545
+ var AgentStreamInterceptor = class {
2546
+ static {
2547
+ __name(this, "AgentStreamInterceptor");
2548
+ }
2549
+ options;
2550
+ constructor(options = {}) {
2551
+ this.options = options;
2552
+ }
2553
+ intercept(context, next) {
2554
+ const res = context.switchToHttp().getResponse();
2555
+ return next.handle().pipe(mergeMap((result) => {
2556
+ pipeAgentStream(result, res, this.options);
2557
+ return EMPTY;
2558
+ }));
2559
+ }
2560
+ };
2561
+ AgentStreamInterceptor = _ts_decorate27([
2562
+ Injectable(),
2563
+ _ts_metadata19("design:type", Function),
2564
+ _ts_metadata19("design:paramtypes", [
2565
+ typeof PipeAgentStreamOptions === "undefined" ? Object : PipeAgentStreamOptions
2566
+ ])
2567
+ ], AgentStreamInterceptor);
2568
+ function _ts_decorate28(decorators, target, key, desc) {
2569
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2570
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2571
+ 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;
2572
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2573
+ }
2574
+ __name(_ts_decorate28, "_ts_decorate");
2575
+ function _ts_metadata20(k, v) {
2576
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2577
+ }
2578
+ __name(_ts_metadata20, "_ts_metadata");
2579
+ function _ts_param12(paramIndex, decorator) {
2580
+ return function(target, key) {
2581
+ decorator(target, key, paramIndex);
2582
+ };
2583
+ }
2584
+ __name(_ts_param12, "_ts_param");
2585
+ var AGENT_JOB_NAME = "agent-run";
2586
+ var AgentQueueService = class {
2587
+ static {
2588
+ __name(this, "AgentQueueService");
2589
+ }
2590
+ queue;
2591
+ constructor(queue) {
2592
+ this.queue = queue;
2593
+ }
2594
+ /** Enqueues an agent run and returns the created job id. */
2595
+ async enqueue(data, jobOptions) {
2596
+ const job = await this.queue.add(AGENT_JOB_NAME, data, jobOptions);
2597
+ return job.id;
2598
+ }
2599
+ };
2600
+ AgentQueueService = _ts_decorate28([
2601
+ Injectable(),
2602
+ _ts_param12(0, Inject(AGENT_QUEUE)),
2603
+ _ts_metadata20("design:type", Function),
2604
+ _ts_metadata20("design:paramtypes", [
2605
+ typeof QueueLike === "undefined" ? Object : QueueLike
2606
+ ])
2607
+ ], AgentQueueService);
2608
+ function _ts_decorate29(decorators, target, key, desc) {
2609
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2610
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2611
+ 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;
2612
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2613
+ }
2614
+ __name(_ts_decorate29, "_ts_decorate");
2615
+ function _ts_metadata21(k, v) {
2616
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2617
+ }
2618
+ __name(_ts_metadata21, "_ts_metadata");
2619
+ var AgentJobProcessor = class {
2620
+ static {
2621
+ __name(this, "AgentJobProcessor");
2622
+ }
2623
+ agents;
2624
+ constructor(agents) {
2625
+ this.agents = agents;
2626
+ }
2627
+ async run(data) {
2628
+ const agent = this.agents.get(data.agent);
2629
+ if (!agent) {
2630
+ throw new Error(`Cannot process job: unknown agent "${data.agent}". Is it registered?`);
2631
+ }
2632
+ return agent.run(data.input, data.options);
2633
+ }
2634
+ };
2635
+ AgentJobProcessor = _ts_decorate29([
2636
+ Injectable(),
2637
+ _ts_metadata21("design:type", Function),
2638
+ _ts_metadata21("design:paramtypes", [
2639
+ typeof AgentRegistry === "undefined" ? Object : AgentRegistry
2640
+ ])
2641
+ ], AgentJobProcessor);
2642
+
2643
+ // src/jobs/agent-jobs.module.ts
2644
+ function _ts_decorate30(decorators, target, key, desc) {
2645
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2646
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2647
+ 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;
2648
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2649
+ }
2650
+ __name(_ts_decorate30, "_ts_decorate");
2651
+ function _ts_metadata22(k, v) {
2652
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2653
+ }
2654
+ __name(_ts_metadata22, "_ts_metadata");
2655
+ function _ts_param13(paramIndex, decorator) {
2656
+ return function(target, key) {
2657
+ decorator(target, key, paramIndex);
2658
+ };
2659
+ }
2660
+ __name(_ts_param13, "_ts_param");
2661
+ var AGENT_JOBS_OPTIONS = /* @__PURE__ */ Symbol("AGENT_JOBS_OPTIONS");
2662
+ var DEFAULT_QUEUE = "ai-agent-runs";
2663
+ async function loadBullMq() {
2664
+ const specifier = "bullmq";
2665
+ return import(specifier);
2666
+ }
2667
+ __name(loadBullMq, "loadBullMq");
2668
+ var AgentWorkerManager = class AgentWorkerManager2 {
2669
+ static {
2670
+ __name(this, "AgentWorkerManager");
2671
+ }
2672
+ options;
2673
+ processor;
2674
+ worker;
2675
+ constructor(options, processor) {
2676
+ this.options = options;
2677
+ this.processor = processor;
2678
+ }
2679
+ async onModuleInit() {
2680
+ if (this.options.runWorker === false) {
2681
+ return;
2682
+ }
2683
+ const { Worker } = await loadBullMq();
2684
+ this.worker = new Worker(this.options.queueName ?? DEFAULT_QUEUE, async (job) => {
2685
+ if (job.name === AGENT_JOB_NAME) {
2686
+ return this.processor.run(job.data);
2687
+ }
2688
+ return void 0;
2689
+ }, {
2690
+ connection: this.options.connection
2691
+ });
2692
+ }
2693
+ async onModuleDestroy() {
2694
+ await this.worker?.close();
2695
+ }
2696
+ };
2697
+ AgentWorkerManager = _ts_decorate30([
2698
+ Injectable(),
2699
+ _ts_param13(0, Inject(AGENT_JOBS_OPTIONS)),
2700
+ _ts_metadata22("design:type", Function),
2701
+ _ts_metadata22("design:paramtypes", [
2702
+ typeof AgentJobsOptions === "undefined" ? Object : AgentJobsOptions,
2703
+ typeof AgentJobProcessor === "undefined" ? Object : AgentJobProcessor
2704
+ ])
2705
+ ], AgentWorkerManager);
2706
+ var AgentJobsModule = class _AgentJobsModule {
2707
+ static {
2708
+ __name(this, "AgentJobsModule");
2709
+ }
2710
+ static forRoot(options) {
2711
+ return {
2712
+ module: _AgentJobsModule,
2713
+ providers: [
2714
+ {
2715
+ provide: AGENT_JOBS_OPTIONS,
2716
+ useValue: options
2717
+ },
2718
+ {
2719
+ provide: AGENT_QUEUE,
2720
+ useFactory: /* @__PURE__ */ __name(async () => {
2721
+ const { Queue } = await loadBullMq();
2722
+ return new Queue(options.queueName ?? DEFAULT_QUEUE, {
2723
+ connection: options.connection
2724
+ });
2725
+ }, "useFactory")
2726
+ },
2727
+ AgentQueueService,
2728
+ AgentJobProcessor,
2729
+ AgentWorkerManager
2730
+ ],
2731
+ exports: [
2732
+ AgentQueueService,
2733
+ AgentJobProcessor
2734
+ ]
2735
+ };
2736
+ }
2737
+ };
2738
+ AgentJobsModule = _ts_decorate30([
2739
+ Module({})
2740
+ ], AgentJobsModule);
2741
+
2742
+ // src/rag/adapters/pgvector/pgvector-store.ts
2743
+ var PgVectorStore = class {
2744
+ static {
2745
+ __name(this, "PgVectorStore");
2746
+ }
2747
+ pool;
2748
+ table;
2749
+ constructor(pool, options = {}) {
2750
+ this.pool = pool;
2751
+ this.table = options.table ?? "ai_documents";
2752
+ }
2753
+ async upsert(documents) {
2754
+ for (const doc of documents) {
2755
+ if (!doc.embedding) {
2756
+ throw new Error(`Document "${doc.id}" has no embedding. PgVectorStore requires precomputed embeddings (use RagService.ingest).`);
2757
+ }
2758
+ await this.pool.query(`INSERT INTO ${this.table} (id, content, embedding, metadata)
2759
+ VALUES ($1, $2, $3, $4)
2760
+ ON CONFLICT (id) DO UPDATE
2761
+ SET content = EXCLUDED.content,
2762
+ embedding = EXCLUDED.embedding,
2763
+ metadata = EXCLUDED.metadata`, [
2764
+ doc.id,
2765
+ doc.content,
2766
+ toVectorLiteral(doc.embedding),
2767
+ doc.metadata ? JSON.stringify(doc.metadata) : null
2768
+ ]);
2769
+ }
2770
+ }
2771
+ async query(embedding, options = {}) {
2772
+ const topK = options.topK ?? 4;
2773
+ const vector = toVectorLiteral(embedding);
2774
+ const params = [
2775
+ vector
2776
+ ];
2777
+ let where = "";
2778
+ if (options.filter) {
2779
+ params.push(JSON.stringify(options.filter));
2780
+ where = `WHERE metadata @> $${params.length}`;
2781
+ }
2782
+ params.push(topK);
2783
+ const limitParam = `$${params.length}`;
2784
+ const { rows } = await this.pool.query(`SELECT id, content, metadata, 1 - (embedding <=> $1) AS score
2785
+ FROM ${this.table}
2786
+ ${where}
2787
+ ORDER BY embedding <=> $1
2788
+ LIMIT ${limitParam}`, params);
2789
+ return rows.map((row) => ({
2790
+ id: row.id,
2791
+ content: row.content,
2792
+ score: Number(row.score),
2793
+ metadata: row.metadata ?? void 0
2794
+ }));
2795
+ }
2796
+ async delete(ids) {
2797
+ if (ids.length === 0) {
2798
+ return;
2799
+ }
2800
+ await this.pool.query(`DELETE FROM ${this.table} WHERE id = ANY($1)`, [
2801
+ ids
2802
+ ]);
2803
+ }
2804
+ async clear() {
2805
+ await this.pool.query(`DELETE FROM ${this.table}`);
2806
+ }
2807
+ };
2808
+ function toVectorLiteral(embedding) {
2809
+ return `[${embedding.join(",")}]`;
2810
+ }
2811
+ __name(toVectorLiteral, "toVectorLiteral");
2812
+
2813
+ // src/ratelimit/in-memory-rate-limiter.ts
2814
+ var InMemoryRateLimiter = class {
2815
+ static {
2816
+ __name(this, "InMemoryRateLimiter");
2817
+ }
2818
+ options;
2819
+ buckets = /* @__PURE__ */ new Map();
2820
+ now;
2821
+ constructor(options) {
2822
+ this.options = options;
2823
+ this.now = options.now ?? Date.now;
2824
+ }
2825
+ async consume(key, cost = 1) {
2826
+ const now = this.now();
2827
+ const bucket = this.buckets.get(key) ?? {
2828
+ tokens: this.options.capacity,
2829
+ last: now
2830
+ };
2831
+ const elapsed = now - bucket.last;
2832
+ if (elapsed > 0) {
2833
+ const refill = elapsed / this.options.intervalMs * this.options.refillTokens;
2834
+ bucket.tokens = Math.min(this.options.capacity, bucket.tokens + refill);
2835
+ bucket.last = now;
2836
+ }
2837
+ let allowed = false;
2838
+ if (bucket.tokens >= cost) {
2839
+ bucket.tokens -= cost;
2840
+ allowed = true;
2841
+ }
2842
+ this.buckets.set(key, bucket);
2843
+ return allowed;
2844
+ }
2845
+ };
2846
+ function _ts_decorate31(decorators, target, key, desc) {
2847
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2848
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2849
+ 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;
2850
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2851
+ }
2852
+ __name(_ts_decorate31, "_ts_decorate");
2853
+ var DEFAULT_PII_PATTERNS = [
2854
+ /[\w.+-]+@[\w-]+\.[\w.-]+/g,
2855
+ /\b\d{3}-\d{2}-\d{4}\b/g,
2856
+ /\b(?:\d[ -]*?){13,16}\b/g,
2857
+ /(?:\+?\d[\d\s().-]{7,}\d)/g
2858
+ ];
2859
+ function redactPii(text, patterns = DEFAULT_PII_PATTERNS, replacement = "[REDACTED]") {
2860
+ let out = text;
2861
+ for (const pattern of patterns) {
2862
+ out = out.replace(pattern, replacement);
2863
+ }
2864
+ return out;
2865
+ }
2866
+ __name(redactPii, "redactPii");
2867
+ function redactMessages(messages, patterns = DEFAULT_PII_PATTERNS, replacement = "[REDACTED]") {
2868
+ for (const message of messages) {
2869
+ const content = message.content;
2870
+ if (typeof content === "string") {
2871
+ message.content = redactPii(content, patterns, replacement);
2872
+ } else if (Array.isArray(content)) {
2873
+ for (const part of content) {
2874
+ if (part && typeof part === "object" && typeof part.text === "string") {
2875
+ part.text = redactPii(part.text, patterns, replacement);
2876
+ }
2877
+ }
2878
+ }
2879
+ }
2880
+ }
2881
+ __name(redactMessages, "redactMessages");
2882
+ var PiiRedactionGuardrail = class {
2883
+ static {
2884
+ __name(this, "PiiRedactionGuardrail");
2885
+ }
2886
+ beforeRun(ctx) {
2887
+ redactMessages(ctx.messages);
2888
+ }
2889
+ };
2890
+ PiiRedactionGuardrail = _ts_decorate31([
2891
+ Guardrail(),
2892
+ Injectable()
2893
+ ], PiiRedactionGuardrail);
2894
+ function createPiiRedactionGuardrail(options = {}) {
2895
+ const patterns = options.patterns ?? DEFAULT_PII_PATTERNS;
2896
+ const replacement = options.replacement ?? "[REDACTED]";
2897
+ let ConfiguredPiiRedaction = class ConfiguredPiiRedaction {
2898
+ static {
2899
+ __name(this, "ConfiguredPiiRedaction");
2900
+ }
2901
+ beforeRun(ctx) {
2902
+ redactMessages(ctx.messages, patterns, replacement);
2903
+ }
2904
+ };
2905
+ ConfiguredPiiRedaction = _ts_decorate31([
2906
+ Guardrail(),
2907
+ Injectable()
2908
+ ], ConfiguredPiiRedaction);
2909
+ return ConfiguredPiiRedaction;
2910
+ }
2911
+ __name(createPiiRedactionGuardrail, "createPiiRedactionGuardrail");
2912
+ function _ts_decorate32(decorators, target, key, desc) {
2913
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2914
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2915
+ 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;
2916
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2917
+ }
2918
+ __name(_ts_decorate32, "_ts_decorate");
2919
+ var ContentBlockedError = class extends Error {
2920
+ static {
2921
+ __name(this, "ContentBlockedError");
2922
+ }
2923
+ reason;
2924
+ constructor(reason) {
2925
+ super(`Content blocked by moderation: ${reason}`), this.reason = reason;
2926
+ this.name = "ContentBlockedError";
2927
+ }
2928
+ };
2929
+ function messagesText(messages) {
2930
+ return messages.map((m) => {
2931
+ const content = m.content;
2932
+ if (typeof content === "string") {
2933
+ return content;
2934
+ }
2935
+ if (Array.isArray(content)) {
2936
+ return content.map((p) => p && typeof p.text === "string" ? p.text : "").join(" ");
2937
+ }
2938
+ return "";
2939
+ }).join("\n");
2940
+ }
2941
+ __name(messagesText, "messagesText");
2942
+ function createModerationGuardrail(options = {}) {
2943
+ const blocked = (options.blocked ?? []).map((t) => t.toLowerCase());
2944
+ const moderate = options.moderate;
2945
+ let ConfiguredModeration = class ConfiguredModeration {
2946
+ static {
2947
+ __name(this, "ConfiguredModeration");
2948
+ }
2949
+ async beforeRun(ctx) {
2950
+ const text = messagesText(ctx.messages);
2951
+ const lower = text.toLowerCase();
2952
+ const hit = blocked.find((term) => lower.includes(term));
2953
+ if (hit) {
2954
+ throw new ContentBlockedError(`matched blocked term "${hit}"`);
2955
+ }
2956
+ if (moderate && await moderate(text)) {
2957
+ throw new ContentBlockedError("failed custom moderation");
2958
+ }
2959
+ }
2960
+ };
2961
+ ConfiguredModeration = _ts_decorate32([
2962
+ Guardrail(),
2963
+ Injectable()
2964
+ ], ConfiguredModeration);
2965
+ return ConfiguredModeration;
2966
+ }
2967
+ __name(createModerationGuardrail, "createModerationGuardrail");
2968
+ function _ts_decorate33(decorators, target, key, desc) {
2969
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2970
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2971
+ 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;
2972
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2973
+ }
2974
+ __name(_ts_decorate33, "_ts_decorate");
2975
+ function _ts_metadata23(k, v) {
2976
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2977
+ }
2978
+ __name(_ts_metadata23, "_ts_metadata");
2979
+ var ModelReranker = class {
2980
+ static {
2981
+ __name(this, "ModelReranker");
2982
+ }
2983
+ providers;
2984
+ model;
2985
+ constructor(providers, model) {
2986
+ this.providers = providers;
2987
+ this.model = model;
2988
+ }
2989
+ async rerank(query, results, topN) {
2990
+ if (results.length === 0) {
2991
+ return [];
2992
+ }
2993
+ const { ranking } = await rerank({
2994
+ model: this.providers.getRerankingModel(this.model),
2995
+ query,
2996
+ documents: results.map((r) => r.content),
2997
+ topN
2998
+ });
2999
+ return ranking.map((entry) => ({
3000
+ ...results[entry.originalIndex],
3001
+ score: entry.score
3002
+ }));
3003
+ }
3004
+ };
3005
+ ModelReranker = _ts_decorate33([
3006
+ Injectable(),
3007
+ _ts_metadata23("design:type", Function),
3008
+ _ts_metadata23("design:paramtypes", [
3009
+ typeof ProviderRegistry === "undefined" ? Object : ProviderRegistry,
3010
+ String
3011
+ ])
3012
+ ], ModelReranker);
3013
+
3014
+ // src/rag/adapters/qdrant/qdrant-vector-store.ts
3015
+ var QdrantVectorStore = class {
3016
+ static {
3017
+ __name(this, "QdrantVectorStore");
3018
+ }
3019
+ client;
3020
+ options;
3021
+ constructor(client, options) {
3022
+ this.client = client;
3023
+ this.options = options;
3024
+ }
3025
+ async upsert(documents) {
3026
+ await this.client.upsert(this.options.collection, {
3027
+ wait: true,
3028
+ points: documents.map((doc) => {
3029
+ if (!doc.embedding) {
3030
+ throw new Error(`Document "${doc.id}" has no embedding.`);
3031
+ }
3032
+ return {
3033
+ id: doc.id,
3034
+ vector: doc.embedding,
3035
+ payload: {
3036
+ content: doc.content,
3037
+ ...doc.metadata
3038
+ }
3039
+ };
3040
+ })
3041
+ });
3042
+ }
3043
+ async query(embedding, options = {}) {
3044
+ const results = await this.client.search(this.options.collection, {
3045
+ vector: embedding,
3046
+ limit: options.topK ?? 4,
3047
+ with_payload: true,
3048
+ filter: buildFilter(options.filter)
3049
+ });
3050
+ return results.map((hit) => {
3051
+ const { content, ...metadata } = hit.payload ?? {};
3052
+ return {
3053
+ id: String(hit.id),
3054
+ content: String(content ?? ""),
3055
+ score: hit.score,
3056
+ metadata: Object.keys(metadata).length ? metadata : void 0
3057
+ };
3058
+ });
3059
+ }
3060
+ async delete(ids) {
3061
+ await this.client.delete(this.options.collection, {
3062
+ points: ids
3063
+ });
3064
+ }
3065
+ async clear() {
3066
+ await this.client.delete(this.options.collection, {
3067
+ filter: {}
3068
+ });
3069
+ }
3070
+ };
3071
+ function buildFilter(filter) {
3072
+ if (!filter || Object.keys(filter).length === 0) {
3073
+ return void 0;
3074
+ }
3075
+ return {
3076
+ must: Object.entries(filter).map(([key, value]) => ({
3077
+ key,
3078
+ match: {
3079
+ value
3080
+ }
3081
+ }))
3082
+ };
3083
+ }
3084
+ __name(buildFilter, "buildFilter");
3085
+
3086
+ // src/rag/adapters/pinecone/pinecone-vector-store.ts
3087
+ var PineconeVectorStore = class {
3088
+ static {
3089
+ __name(this, "PineconeVectorStore");
3090
+ }
3091
+ index;
3092
+ constructor(index) {
3093
+ this.index = index;
3094
+ }
3095
+ async upsert(documents) {
3096
+ await this.index.upsert(documents.map((doc) => {
3097
+ if (!doc.embedding) {
3098
+ throw new Error(`Document "${doc.id}" has no embedding.`);
3099
+ }
3100
+ return {
3101
+ id: doc.id,
3102
+ values: doc.embedding,
3103
+ metadata: {
3104
+ content: doc.content,
3105
+ ...doc.metadata
3106
+ }
3107
+ };
3108
+ }));
3109
+ }
3110
+ async query(embedding, options = {}) {
3111
+ const { matches } = await this.index.query({
3112
+ vector: embedding,
3113
+ topK: options.topK ?? 4,
3114
+ includeMetadata: true,
3115
+ filter: options.filter
3116
+ });
3117
+ return (matches ?? []).map((match) => {
3118
+ const { content, ...metadata } = match.metadata ?? {};
3119
+ return {
3120
+ id: match.id,
3121
+ content: String(content ?? ""),
3122
+ score: match.score ?? 0,
3123
+ metadata: Object.keys(metadata).length ? metadata : void 0
3124
+ };
3125
+ });
3126
+ }
3127
+ async delete(ids) {
3128
+ await this.index.deleteMany(ids);
3129
+ }
3130
+ async clear() {
3131
+ await this.index.deleteAll();
3132
+ }
3133
+ };
3134
+
3135
+ // src/websocket/stream-to-socket.ts
3136
+ async function streamAgentToSocket(stream, socket, options = {}) {
3137
+ const chunkEvent = options.chunkEvent ?? "agent:chunk";
3138
+ const doneEvent = options.doneEvent ?? "agent:done";
3139
+ const errorEvent = options.errorEvent ?? "agent:error";
3140
+ try {
3141
+ let text = "";
3142
+ for await (const delta of stream.textStream) {
3143
+ text += delta;
3144
+ socket.emit(chunkEvent, {
3145
+ delta
3146
+ });
3147
+ }
3148
+ socket.emit(doneEvent, {
3149
+ text
3150
+ });
3151
+ return text;
3152
+ } catch (error) {
3153
+ socket.emit(errorEvent, {
3154
+ message: error instanceof Error ? error.message : String(error)
3155
+ });
3156
+ throw error;
3157
+ }
3158
+ }
3159
+ __name(streamAgentToSocket, "streamAgentToSocket");
3160
+
3161
+ export { AGENT_JOB_NAME, AGENT_QUEUE, AI_CACHE, AI_EVENTS, AI_MODULE_OPTIONS, APPROVAL_GATE, Agent, AgentExecutorService, AgentJobProcessor, AgentJobsModule, AgentQueueService, AgentRegistry, AgentStreamInterceptor, AiAgent, AiEventEmitter, AiModule, AiService, AutoApproveGate, BudgetExceededError, BudgetGuard, CONVERSATION_STORE, ContentBlockedError, DEFAULT_MAX_STEPS, DEFAULT_PII_PATTERNS, DEFAULT_PRICING, DenyApproveGate, EVENT_EMITTER, EmbeddingsService, EvalRunner, Guardrail, GuardrailRegistry, HeuristicReranker, ImageService, InMemoryAiCache, InMemoryConversationStore, InMemoryRateLimiter, InMemoryVectorStore, McpService, ModelReranker, PgVectorStore, PiiRedactionGuardrail, PineconeVectorStore, PrismaConversationStore, PromptRegistry, ProviderRegistry, QdrantVectorStore, RATE_LIMITER, RERANKER, RagService, RateLimitGuardrail, RateLimitedError, SemanticMemory, SpeechService, Tool, ToolApprovalDeniedError, ToolRegistry, TranscriptionService, UsageTracker, VECTOR_STORE, bareModelId, cacheKey, costOf, createAgentTool, createCacheMiddleware, createFallbackModel, createLlmJudge, createModerationGuardrail, createPiiRedactionGuardrail, createRetrievalTool, defaultJudge, interpolate, pipeAgentStream, redactMessages, redactPii, splitText, streamAgentToSocket, toMessages };
3162
+ //# sourceMappingURL=index.js.map
3163
+ //# sourceMappingURL=index.js.map