llm-agent-runtime 0.1.6 → 0.1.17

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 (49) hide show
  1. package/README.md +8 -2
  2. package/USAGE.md +528 -283
  3. package/dist/agent.d.ts +2 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +36 -4
  6. package/dist/create-runtime.d.ts +14 -4
  7. package/dist/create-runtime.d.ts.map +1 -1
  8. package/dist/create-runtime.js +108 -20
  9. package/dist/embeddings/xenova.d.ts +19 -0
  10. package/dist/embeddings/xenova.d.ts.map +1 -0
  11. package/dist/embeddings/xenova.js +69 -0
  12. package/dist/env-llm.d.ts +17 -4
  13. package/dist/env-llm.d.ts.map +1 -1
  14. package/dist/env-llm.js +66 -16
  15. package/dist/errors.d.ts +10 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +17 -0
  18. package/dist/index.d.ts +11 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +7 -1
  21. package/dist/intents/define.d.ts +35 -0
  22. package/dist/intents/define.d.ts.map +1 -0
  23. package/dist/intents/define.js +52 -0
  24. package/dist/intents/general.d.ts +37 -0
  25. package/dist/intents/general.d.ts.map +1 -0
  26. package/dist/intents/general.js +67 -0
  27. package/dist/llm.d.ts +2 -2
  28. package/dist/llm.d.ts.map +1 -1
  29. package/dist/llm.js +45 -15
  30. package/dist/rag/index.d.ts +67 -0
  31. package/dist/rag/index.d.ts.map +1 -0
  32. package/dist/rag/index.js +140 -0
  33. package/dist/rag/loaders.d.ts +11 -0
  34. package/dist/rag/loaders.d.ts.map +1 -0
  35. package/dist/rag/loaders.js +80 -0
  36. package/dist/rag/sources.d.ts +29 -0
  37. package/dist/rag/sources.d.ts.map +1 -0
  38. package/dist/rag/sources.js +101 -0
  39. package/dist/services/intent-embeddings.d.ts.map +1 -1
  40. package/dist/services/intent-embeddings.js +5 -6
  41. package/dist/services/token-usage.d.ts +26 -0
  42. package/dist/services/token-usage.d.ts.map +1 -0
  43. package/dist/services/token-usage.js +63 -0
  44. package/dist/services/usage-store.d.ts +24 -0
  45. package/dist/services/usage-store.d.ts.map +1 -0
  46. package/dist/services/usage-store.js +92 -0
  47. package/dist/types.d.ts +47 -15
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +10 -3
package/dist/agent.d.ts CHANGED
@@ -13,7 +13,8 @@ export type AgentFactory = {
13
13
  };
14
14
  export declare function createAgentFactory(options: {
15
15
  llm: BaseChatModel;
16
- intentRegistry: IntentRegistry;
16
+ /** Tools only — context typing is owned by prompts / createAgentRuntime. */
17
+ intentRegistry: IntentRegistry<any>;
17
18
  redisUrl?: string;
18
19
  checkpointer?: BaseCheckpointSaver;
19
20
  }): Promise<AgentFactory>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACxF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE;YAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CACpF,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,GAAG,EAAE,aAAa,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,GAAG,OAAO,CAAC,YAAY,CAAC,CAsCxB"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACxF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE;YAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CACpF,CAAC;AA4CF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,GAAG,EAAE,aAAa,CAAC;IACnB,4EAA4E;IAC5E,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCxB"}
package/dist/agent.js CHANGED
@@ -1,11 +1,43 @@
1
1
  import { createReactAgent } from "@langchain/langgraph/prebuilt";
2
2
  import { MemorySaver } from "@langchain/langgraph-checkpoint";
3
3
  import { RedisSaver } from "@langchain/langgraph-checkpoint-redis";
4
+ import { createClient } from "redis";
5
+ /**
6
+ * RedisSaver needs Redis Stack (RedisJSON + RediSearch).
7
+ * Plain redis://localhost has neither — probe and fall back to MemorySaver.
8
+ */
9
+ async function createCheckpointer(redisUrl, existing) {
10
+ if (existing)
11
+ return existing;
12
+ if (!redisUrl)
13
+ return new MemorySaver();
14
+ const client = createClient({ url: redisUrl });
15
+ client.on("error", () => {
16
+ /* probe client — swallow to avoid process crash */
17
+ });
18
+ try {
19
+ await client.connect();
20
+ const probeKey = `__llm_agent_runtime_probe_${Date.now()}`;
21
+ await client.sendCommand(["JSON.SET", probeKey, "$", "{}"]);
22
+ await client.del(probeKey);
23
+ await client.quit().catch(() => undefined);
24
+ }
25
+ catch {
26
+ await client.quit().catch(() => undefined);
27
+ console.warn("[llm-agent-runtime] Redis Stack (RedisJSON) not available — using in-memory checkpointer. " +
28
+ "Flow cache can still use Redis; install Redis Stack for durable LangGraph checkpoints.");
29
+ return new MemorySaver();
30
+ }
31
+ try {
32
+ return await RedisSaver.fromUrl(redisUrl);
33
+ }
34
+ catch (err) {
35
+ console.warn("[llm-agent-runtime] RedisSaver.fromUrl failed — using in-memory checkpointer:", err instanceof Error ? err.message : err);
36
+ return new MemorySaver();
37
+ }
38
+ }
4
39
  export async function createAgentFactory(options) {
5
- const checkpointer = options.checkpointer ??
6
- (options.redisUrl
7
- ? await RedisSaver.fromUrl(options.redisUrl)
8
- : new MemorySaver());
40
+ const checkpointer = await createCheckpointer(options.redisUrl, options.checkpointer);
9
41
  const fallbackTools = () => {
10
42
  const first = Object.values(options.intentRegistry)[0];
11
43
  return first?.tools("") ?? [];
@@ -1,11 +1,18 @@
1
- import type { AgentRuntimeConfig, InvokeInput, InvokeResult } from "./types.js";
2
- export type AgentRuntime = {
3
- invoke: (input: InvokeInput) => Promise<InvokeResult>;
1
+ import type { AgentRuntimeConfig, InvokeInput, InvokeResult, TokenUsageReport } from "./types.js";
2
+ export type AgentRuntime<TContext = unknown> = {
3
+ invoke: (input: InvokeInput<TContext>) => Promise<InvokeResult>;
4
4
  connect: () => Promise<void>;
5
5
  disconnect: () => Promise<void>;
6
6
  clearFlow: (threadId: string) => Promise<void>;
7
7
  /** Clears LangGraph checkpoint thread (conversation memory). */
8
8
  clearThread: (threadId: string) => Promise<void>;
9
+ /**
10
+ * Frontend “clear session”: checkpoint + sticky flow state + token usage.
11
+ * Same as clearThread + usage wipe.
12
+ */
13
+ clearSession: (threadId: string) => Promise<void>;
14
+ /** Read accumulated token usage for a thread (Redis or memory). */
15
+ getUsage: (threadId: string) => Promise<TokenUsageReport["total"]>;
9
16
  getCachedAnswer: (message: string) => Promise<string | undefined>;
10
17
  setCachedAnswer: (message: string, answer: string) => Promise<void>;
11
18
  /** Invalidate embedding cache after changing intent examples at runtime. */
@@ -14,6 +21,9 @@ export type AgentRuntime = {
14
21
  /**
15
22
  * Factory for a reusable agent runtime.
16
23
  * Engine pipeline: resolveFlow → runAgent → getTurnMessages → extract → finalize
24
+ *
25
+ * Pass your context type so prompts get typed `ctx.context`:
26
+ * `createAgentRuntime<{ userInfo?: { name?: string } }>({ ... })`
17
27
  */
18
- export declare function createAgentRuntime(config: AgentRuntimeConfig): Promise<AgentRuntime>;
28
+ export declare function createAgentRuntime<TContext = unknown>(config: AgentRuntimeConfig<TContext>): Promise<AgentRuntime<TContext>>;
19
29
  //# sourceMappingURL=create-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-runtime.d.ts","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EAEb,MAAM,YAAY,CAAC;AAepB,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,gEAAgE;IAChE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,4EAA4E;IAC5E,0BAA0B,EAAE,MAAM,IAAI,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,CAAC,CAoPvB"}
1
+ {"version":3,"file":"create-runtime.d.ts","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EAEZ,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAepB,MAAM,MAAM,YAAY,CAAC,QAAQ,GAAG,OAAO,IAAI;IAC7C,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,gEAAgE;IAChE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD;;;OAGG;IACH,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,mEAAmE;IACnE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,4EAA4E;IAC5E,0BAA0B,EAAE,MAAM,IAAI,CAAC;CACxC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACzD,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GACnC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAwVjC"}
@@ -10,6 +10,9 @@ import { createCompleteOnFinalize, toolOutputMapToExtractors, } from "./services
10
10
  import { createFlowRouter, stickySetFromIntents, } from "./services/flow-router.js";
11
11
  import { createIntentEmbeddings } from "./services/intent-embeddings.js";
12
12
  import { createIntentRouter } from "./services/intent-router.js";
13
+ import { extractTokenUsageFromMessages } from "./services/token-usage.js";
14
+ import { createUsageStore } from "./services/usage-store.js";
15
+ import { assertInvokeInput } from "./errors.js";
13
16
  import { getLastMessageContent } from "./utils/message.js";
14
17
  /** Messages for this user turn only (used to extract tool outputs). */
15
18
  const getTurnMessages = (allMessages, userMessage) => {
@@ -26,16 +29,34 @@ const getTurnMessages = (allMessages, userMessage) => {
26
29
  /**
27
30
  * Factory for a reusable agent runtime.
28
31
  * Engine pipeline: resolveFlow → runAgent → getTurnMessages → extract → finalize
32
+ *
33
+ * Pass your context type so prompts get typed `ctx.context`:
34
+ * `createAgentRuntime<{ userInfo?: { name?: string } }>({ ... })`
29
35
  */
30
36
  export async function createAgentRuntime(config) {
31
- // Wire LangSmith tracing: auto-detect from env or explicit config
32
- const langsmithKey = process.env.LANGSMITH_API_KEY;
33
- const tracingEnabled = config.tracing?.enabled ?? !!langsmithKey;
37
+ // Wire LangSmith tracing before models are created.
38
+ // Respect LANGSMITH_PROJECT / LANGCHAIN_PROJECT (do not force a package default over env).
39
+ const langsmithKey = process.env.LANGSMITH_API_KEY?.trim() ||
40
+ process.env.LANGCHAIN_API_KEY?.trim() ||
41
+ undefined;
42
+ const tracingEnabled = config.tracing?.enabled ?? Boolean(langsmithKey);
34
43
  if (tracingEnabled) {
35
- process.env.LANGCHAIN_TRACING_V2 = "true";
36
- if (langsmithKey)
44
+ if (!langsmithKey) {
45
+ console.warn("[llm-agent-runtime] tracing.enabled but no LANGSMITH_API_KEY / LANGCHAIN_API_KEY set");
46
+ }
47
+ else {
48
+ const project = config.tracing?.projectName?.trim() ||
49
+ process.env.LANGSMITH_PROJECT?.trim() ||
50
+ process.env.LANGCHAIN_PROJECT?.trim() ||
51
+ "llm-agent-runtime";
52
+ process.env.LANGCHAIN_TRACING_V2 = "true";
53
+ process.env.LANGSMITH_TRACING = "true";
37
54
  process.env.LANGCHAIN_API_KEY = langsmithKey;
38
- process.env.LANGCHAIN_PROJECT = config.tracing?.projectName ?? "llm-agent-runtime";
55
+ process.env.LANGSMITH_API_KEY = langsmithKey;
56
+ process.env.LANGCHAIN_PROJECT = project;
57
+ process.env.LANGSMITH_PROJECT = project;
58
+ console.log("[llm-agent-runtime] LangSmith tracing on", { project });
59
+ }
39
60
  }
40
61
  const defaultIntent = config.defaultIntent ?? config.intents[0]?.name ?? "greetings";
41
62
  const intentNames = new Set(config.intents.map((i) => i.name));
@@ -56,6 +77,15 @@ export async function createAgentRuntime(config) {
56
77
  const chat = config.models?.chat ?? created.chat;
57
78
  const intentRouterModel = config.models?.intentRouter ?? created.intentRouter;
58
79
  const embeddings = config.models?.embeddings ?? created.embeddings;
80
+ console.log("[llm-agent-runtime] models", {
81
+ provider: created.config.provider,
82
+ chat: created.config.model,
83
+ intentRouter: created.config.intentRouterModel,
84
+ embeddingsProvider: created.config.embeddingsProvider,
85
+ embeddings: created.config.embeddingsModel,
86
+ baseUrl: llm.baseUrl,
87
+ embeddingsBaseUrl: llm.embeddingsBaseUrl,
88
+ });
59
89
  const fromMap = config.toolOutputMap
60
90
  ? toolOutputMapToExtractors(config.toolOutputMap)
61
91
  : null;
@@ -70,7 +100,7 @@ export async function createAgentRuntime(config) {
70
100
  toolOutputMap: config.toolOutputMap,
71
101
  })
72
102
  : undefined);
73
- // Redis client when redisUrl is set (flow state + optional answer cache)
103
+ // Redis client when redisUrl is set (flow state + optional answer cache + usage)
74
104
  const redis = config.redisUrl
75
105
  ? createRedis(config.redisUrl)
76
106
  : undefined;
@@ -83,6 +113,10 @@ export async function createAgentRuntime(config) {
83
113
  scope: config.cache?.scope,
84
114
  },
85
115
  });
116
+ const usageStore = createUsageStore({
117
+ redis: redis?.client,
118
+ ttlSeconds: config.cache?.ttlSeconds ?? 60 * 60 * 24 * 7,
119
+ });
86
120
  const agentFactory = await createAgentFactory({
87
121
  llm: chat,
88
122
  intentRegistry: config.intentRegistry,
@@ -127,21 +161,44 @@ export async function createAgentRuntime(config) {
127
161
  includeUnknown: config.includeUnknownToolOutputs ?? false,
128
162
  })
129
163
  : extractRawToolOutputs);
164
+ const resolveSharedPrompt = (ctx) => {
165
+ const shared = config.sharedPrompt;
166
+ if (!shared)
167
+ return "";
168
+ return typeof shared === "function" ? shared(ctx) : shared;
169
+ };
170
+ const buildIntentPrompt = (ctx) => {
171
+ const binding = config.intentRegistry[ctx.intent];
172
+ if (!binding) {
173
+ const fallback = Object.values(config.intentRegistry)[0];
174
+ return fallback?.prompt(ctx) ?? "";
175
+ }
176
+ return binding.prompt(ctx);
177
+ };
130
178
  const buildSystemPrompt = config.buildSystemPrompt ??
131
179
  ((ctx) => {
132
- const binding = config.intentRegistry[ctx.intent];
133
- if (!binding) {
134
- const fallback = Object.values(config.intentRegistry)[0];
135
- return fallback?.prompt(ctx) ?? "";
136
- }
137
- return binding.prompt(ctx);
180
+ const shared = resolveSharedPrompt(ctx).trim();
181
+ const intentPrompt = buildIntentPrompt(ctx).trim();
182
+ if (shared && intentPrompt)
183
+ return `${shared}\n\n${intentPrompt}`;
184
+ return shared || intentPrompt;
138
185
  });
139
186
  const resolvePhoneKey = config.resolvePhoneKey ??
140
187
  (({ threadId, phoneKey }) => phoneKey ?? threadId);
188
+ const clearSession = async (threadId) => {
189
+ const saver = agentFactory.checkpointer;
190
+ if (typeof saver.deleteThread === "function") {
191
+ await saver.deleteThread(threadId);
192
+ }
193
+ await chatCache.clearChatCacheFlowState(threadId);
194
+ await usageStore.clearThreadUsage(threadId);
195
+ };
141
196
  const invoke = async (input) => {
197
+ assertInvokeInput(input);
142
198
  if (chatCache.enabled) {
143
199
  const cached = await chatCache.getCachedAnswer(input.message);
144
200
  if (cached) {
201
+ const total = await usageStore.getThreadUsage(input.threadId);
145
202
  return {
146
203
  messages: [],
147
204
  answer: cached,
@@ -150,6 +207,16 @@ export async function createAgentRuntime(config) {
150
207
  toolOutputs: {},
151
208
  flowCompleted: false,
152
209
  extras: { cacheHit: true },
210
+ usage: {
211
+ turn: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
212
+ flow: {
213
+ inputTokens: 0,
214
+ outputTokens: 0,
215
+ totalTokens: 0,
216
+ intent: null,
217
+ },
218
+ total,
219
+ },
153
220
  };
154
221
  }
155
222
  }
@@ -197,6 +264,30 @@ export async function createAgentRuntime(config) {
197
264
  if (chatCache.enabled && answer) {
198
265
  await chatCache.setCachedAnswer(input.message, answer);
199
266
  }
267
+ // Token usage: this turn + sticky-flow bucket + thread total (Redis when set)
268
+ const turnUsage = extractTokenUsageFromMessages(turnMessages);
269
+ const flowIntentForUsage = finalized.flow.active && finalized.flow.intent
270
+ ? finalized.flow.intent
271
+ : stickyFlows.has(promptIntent)
272
+ ? promptIntent
273
+ : null;
274
+ const { total, flow: flowUsage } = await usageStore.recordTurn({
275
+ threadId: input.threadId,
276
+ flowIntent: flowIntentForUsage,
277
+ turn: turnUsage,
278
+ });
279
+ if (finalized.flowCompleted && flowIntentForUsage) {
280
+ // Keep completed-flow totals in this response; reset bucket for next flow
281
+ await usageStore.clearFlowUsage(input.threadId, flowIntentForUsage);
282
+ }
283
+ const usage = {
284
+ turn: turnUsage,
285
+ flow: {
286
+ ...flowUsage,
287
+ intent: flowIntentForUsage,
288
+ },
289
+ total,
290
+ };
200
291
  return {
201
292
  messages: resultMessages,
202
293
  answer,
@@ -205,6 +296,7 @@ export async function createAgentRuntime(config) {
205
296
  toolOutputs,
206
297
  flowCompleted: finalized.flowCompleted,
207
298
  extras: finalized.extras,
299
+ usage,
208
300
  ...(llmResult
209
301
  ? { router: { action: llmResult.action, reason: llmResult.reason } }
210
302
  : {}),
@@ -219,13 +311,9 @@ export async function createAgentRuntime(config) {
219
311
  await redis?.disconnect();
220
312
  },
221
313
  clearFlow: chatCache.clearChatCacheFlowState,
222
- clearThread: async (threadId) => {
223
- const saver = agentFactory.checkpointer;
224
- if (typeof saver.deleteThread === "function") {
225
- await saver.deleteThread(threadId);
226
- }
227
- await chatCache.clearChatCacheFlowState(threadId);
228
- },
314
+ clearThread: clearSession,
315
+ clearSession,
316
+ getUsage: usageStore.getThreadUsage,
229
317
  getCachedAnswer: chatCache.getCachedAnswer,
230
318
  setCachedAnswer: chatCache.setCachedAnswer,
231
319
  invalidateIntentEmbeddings: intentEmbeddings.invalidate,
@@ -0,0 +1,19 @@
1
+ import { Embeddings, type EmbeddingsParams } from "@langchain/core/embeddings";
2
+ export type XenovaEmbeddingsParams = EmbeddingsParams & {
3
+ /** Hugging Face / Xenova model id. Default: Xenova/all-MiniLM-L6-v2 */
4
+ model?: string;
5
+ };
6
+ /**
7
+ * Free, in-process embeddings via `@xenova/transformers` (no Ollama / OpenAI).
8
+ * Install: `pnpm add @xenova/transformers`
9
+ */
10
+ export declare class XenovaEmbeddings extends Embeddings {
11
+ model: string;
12
+ private pipelinePromise;
13
+ constructor(fields?: XenovaEmbeddingsParams);
14
+ private getPipeline;
15
+ private toVector;
16
+ embedDocuments(documents: string[]): Promise<number[][]>;
17
+ embedQuery(document: string): Promise<number[]>;
18
+ }
19
+ //# sourceMappingURL=xenova.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xenova.d.ts","sourceRoot":"","sources":["../../src/embeddings/xenova.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAoD/E,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG;IACtD,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,eAAe,CAAmD;gBAE9D,MAAM,CAAC,EAAE,sBAAsB;YAK7B,WAAW;IAUzB,OAAO,CAAC,QAAQ;IAQV,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAUxD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAItD"}
@@ -0,0 +1,69 @@
1
+ import { Embeddings } from "@langchain/core/embeddings";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ async function loadXenovaTransformers() {
6
+ const errors = [];
7
+ try {
8
+ return (await import("@xenova/transformers"));
9
+ }
10
+ catch (err) {
11
+ errors.push(`package import: ${err instanceof Error ? err.message : String(err)}`);
12
+ }
13
+ // pnpm nests this package; resolve from the app's node_modules / cwd.
14
+ try {
15
+ const requireFromCwd = createRequire(path.join(process.cwd(), "package.json"));
16
+ const resolved = requireFromCwd.resolve("@xenova/transformers");
17
+ return (await import(pathToFileURL(resolved).href));
18
+ }
19
+ catch (err) {
20
+ errors.push(`cwd resolve: ${err instanceof Error ? err.message : String(err)}`);
21
+ }
22
+ throw new Error([
23
+ 'embeddingsProvider "xenova" could not load @xenova/transformers.',
24
+ "Install in your app: pnpm add @xenova/transformers",
25
+ "If you see a sharp error, rebuild native deps: pnpm rebuild sharp --config.ignore-scripts=false",
26
+ ...errors.map((e) => ` - ${e.split("\n")[0]}`),
27
+ ].join("\n"));
28
+ }
29
+ /**
30
+ * Free, in-process embeddings via `@xenova/transformers` (no Ollama / OpenAI).
31
+ * Install: `pnpm add @xenova/transformers`
32
+ */
33
+ export class XenovaEmbeddings extends Embeddings {
34
+ model;
35
+ pipelinePromise = null;
36
+ constructor(fields) {
37
+ super(fields ?? {});
38
+ this.model = fields?.model ?? "Xenova/all-MiniLM-L6-v2";
39
+ }
40
+ async getPipeline() {
41
+ if (!this.pipelinePromise) {
42
+ this.pipelinePromise = (async () => {
43
+ const mod = await loadXenovaTransformers();
44
+ return mod.pipeline("feature-extraction", this.model);
45
+ })();
46
+ }
47
+ return this.pipelinePromise;
48
+ }
49
+ toVector(result) {
50
+ if (typeof result.tolist === "function") {
51
+ const list = result.tolist();
52
+ return Array.isArray(list[0]) ? list[0] : list;
53
+ }
54
+ return Array.from(result.data);
55
+ }
56
+ async embedDocuments(documents) {
57
+ const pipe = await this.getPipeline();
58
+ const vectors = [];
59
+ for (const doc of documents) {
60
+ const result = await pipe(doc, { pooling: "mean", normalize: true });
61
+ vectors.push(this.toVector(result));
62
+ }
63
+ return vectors;
64
+ }
65
+ async embedQuery(document) {
66
+ const [vector] = await this.embedDocuments([document]);
67
+ return vector ?? [];
68
+ }
69
+ }
package/dist/env-llm.d.ts CHANGED
@@ -1,12 +1,25 @@
1
- import type { LlmConfig } from "./types.js";
1
+ import type { EmbeddingsProvider, LlmConfig, LlmProvider } from "./types.js";
2
+ /** Vercel / Lambda / Netlify — @xenova/transformers + sharp do not work here. */
3
+ export declare function isServerlessRuntime(env?: NodeJS.ProcessEnv): boolean;
4
+ /**
5
+ * Resolve embeddings backend.
6
+ *
7
+ * - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova), except:
8
+ * on serverless (Vercel/Lambda/…) with OPENAI_API_KEY, xenova → openai
9
+ * (Transformers.js / sharp cannot load in those runtimes).
10
+ * - openrouter is not an embeddings backend → xenova locally, openai on serverless+key.
11
+ * - If unset: ollama chat → ollama; serverless+OPENAI_API_KEY → openai; else → xenova.
12
+ */
13
+ export declare function resolveEmbeddingsProvider(env: NodeJS.ProcessEnv, chatProvider: LlmProvider): EmbeddingsProvider;
2
14
  /**
3
15
  * Build LlmConfig from process.env.
4
16
  *
5
17
  * Env knobs:
6
- * - LLM_PROVIDER / EMBEDDINGS_PROVIDER — ollama | openai | openrouter
18
+ * - LLM_PROVIDER — ollama | openai | openrouter
19
+ * - EMBEDDINGS_PROVIDER — ollama | openai | xenova
20
+ * (default: ollama if LLM is ollama; openai on Vercel/Lambda when OPENAI_API_KEY set; else xenova)
7
21
  * - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
8
- * - INTENT_ROUTER_MODEL / OPENAI_INTENT_ROUTER_MODEL / OPENROUTER_INTENT_ROUTER_MODEL
9
- * - OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
22
+ * - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
10
23
  * - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
11
24
  */
12
25
  export declare function llmConfigFromEnv(env?: NodeJS.ProcessEnv): LlmConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"env-llm.d.ts","sourceRoot":"","sources":["../src/env-llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAqBzD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,CAiDX"}
1
+ {"version":3,"file":"env-llm.d.ts","sourceRoot":"","sources":["../src/env-llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqB7E,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAQT;AAMD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,YAAY,EAAE,WAAW,GACxB,kBAAkB,CAuBpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,CAuDX"}
package/dist/env-llm.js CHANGED
@@ -1,45 +1,95 @@
1
- const asProvider = (value, fallback) => {
1
+ const asChatProvider = (value, fallback) => {
2
2
  const normalized = value?.trim().toLowerCase();
3
3
  if (normalized === "openai" ||
4
4
  normalized === "gpt" ||
5
5
  normalized === "chatgpt") {
6
6
  return "openai";
7
7
  }
8
- if (normalized === "openrouter" ||
9
- normalized === "or") {
8
+ if (normalized === "openrouter" || normalized === "or") {
10
9
  return "openrouter";
11
10
  }
12
11
  if (normalized === "ollama")
13
12
  return "ollama";
14
13
  return fallback;
15
14
  };
15
+ /** Vercel / Lambda / Netlify — @xenova/transformers + sharp do not work here. */
16
+ export function isServerlessRuntime(env = process.env) {
17
+ return Boolean(env.VERCEL ||
18
+ env.VERCEL_ENV ||
19
+ env.AWS_LAMBDA_FUNCTION_NAME ||
20
+ env.NETLIFY ||
21
+ env.NETLIFY_DEV);
22
+ }
23
+ function preferOpenAiOnServerless(env) {
24
+ return isServerlessRuntime(env) && Boolean(env.OPENAI_API_KEY?.trim());
25
+ }
26
+ /**
27
+ * Resolve embeddings backend.
28
+ *
29
+ * - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova), except:
30
+ * on serverless (Vercel/Lambda/…) with OPENAI_API_KEY, xenova → openai
31
+ * (Transformers.js / sharp cannot load in those runtimes).
32
+ * - openrouter is not an embeddings backend → xenova locally, openai on serverless+key.
33
+ * - If unset: ollama chat → ollama; serverless+OPENAI_API_KEY → openai; else → xenova.
34
+ */
35
+ export function resolveEmbeddingsProvider(env, chatProvider) {
36
+ const raw = env.EMBEDDINGS_PROVIDER?.trim().toLowerCase();
37
+ const serverlessOpenAi = preferOpenAiOnServerless(env);
38
+ if (raw === "openai" || raw === "gpt" || raw === "chatgpt")
39
+ return "openai";
40
+ if (raw === "ollama")
41
+ return "ollama";
42
+ if (raw === "xenova" ||
43
+ raw === "transformers" ||
44
+ raw === "local" ||
45
+ raw === "minilm") {
46
+ return serverlessOpenAi ? "openai" : "xenova";
47
+ }
48
+ // OpenRouter has chat only — not an embeddings API.
49
+ if (raw === "openrouter" || raw === "or") {
50
+ return serverlessOpenAi ? "openai" : "xenova";
51
+ }
52
+ // Unset / unknown
53
+ if (chatProvider === "ollama")
54
+ return "ollama";
55
+ if (serverlessOpenAi)
56
+ return "openai";
57
+ return "xenova";
58
+ }
16
59
  /**
17
60
  * Build LlmConfig from process.env.
18
61
  *
19
62
  * Env knobs:
20
- * - LLM_PROVIDER / EMBEDDINGS_PROVIDER — ollama | openai | openrouter
63
+ * - LLM_PROVIDER — ollama | openai | openrouter
64
+ * - EMBEDDINGS_PROVIDER — ollama | openai | xenova
65
+ * (default: ollama if LLM is ollama; openai on Vercel/Lambda when OPENAI_API_KEY set; else xenova)
21
66
  * - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
22
- * - INTENT_ROUTER_MODEL / OPENAI_INTENT_ROUTER_MODEL / OPENROUTER_INTENT_ROUTER_MODEL
23
- * - OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
67
+ * - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
24
68
  * - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
25
69
  */
26
70
  export function llmConfigFromEnv(env = process.env) {
27
- const provider = asProvider(env.LLM_PROVIDER, "ollama");
28
- const embeddingsProvider = asProvider(env.EMBEDDINGS_PROVIDER ?? env.LLM_PROVIDER, provider);
71
+ const provider = asChatProvider(env.LLM_PROVIDER, "ollama");
72
+ const embeddingsProvider = resolveEmbeddingsProvider(env, provider);
29
73
  const openrouterBaseUrl = env.OPENROUTER_BASE_URL ?? "https://openrouter.ai/api/v1";
74
+ const ollamaBaseUrl = env.OLLAMA_BASE_URL ?? "http://localhost:11434";
75
+ const resolvedEmbeddingsModel = embeddingsProvider === "openai"
76
+ ? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
77
+ : embeddingsProvider === "xenova"
78
+ ? (env.XENOVA_EMBEDDINGS_MODEL ?? "Xenova/all-MiniLM-L6-v2")
79
+ : (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest");
30
80
  if (provider === "openrouter") {
31
81
  return {
32
82
  provider,
33
- embeddingsProvider: embeddingsProvider === "openrouter" ? "ollama" : embeddingsProvider,
83
+ embeddingsProvider,
34
84
  model: env.OPENROUTER_MODEL ?? "meta-llama/llama-4-scout",
35
85
  intentRouterModel: env.OPENROUTER_INTENT_ROUTER_MODEL ??
36
86
  env.OPENROUTER_MODEL ??
37
87
  "meta-llama/llama-4-scout",
38
- embeddingsModel: embeddingsProvider === "openai"
39
- ? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
40
- : (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest"),
88
+ embeddingsModel: resolvedEmbeddingsModel,
41
89
  baseUrl: openrouterBaseUrl,
90
+ embeddingsBaseUrl: embeddingsProvider === "ollama" ? ollamaBaseUrl : undefined,
42
91
  apiKey: env.OPENROUTER_API_KEY,
92
+ embeddingsApiKey: env.OPENAI_API_KEY,
43
93
  };
44
94
  }
45
95
  return {
@@ -55,10 +105,10 @@ export function llmConfigFromEnv(env = process.env) {
55
105
  : (env.INTENT_ROUTER_MODEL ??
56
106
  env.OLLAMA_INTENT_ROUTER_MODEL ??
57
107
  "qwen2.5:7b"),
58
- embeddingsModel: embeddingsProvider === "openai"
59
- ? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
60
- : (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest"),
61
- baseUrl: env.OLLAMA_BASE_URL,
108
+ embeddingsModel: resolvedEmbeddingsModel,
109
+ baseUrl: provider === "openai" ? undefined : ollamaBaseUrl,
110
+ embeddingsBaseUrl: embeddingsProvider === "ollama" ? ollamaBaseUrl : undefined,
62
111
  apiKey: env.OPENAI_API_KEY,
112
+ embeddingsApiKey: env.OPENAI_API_KEY,
63
113
  };
64
114
  }
@@ -0,0 +1,10 @@
1
+ /** Thrown when `invoke` input fails validation (e.g. missing threadId). */
2
+ export declare class AgentRuntimeError extends Error {
3
+ readonly code: string;
4
+ constructor(code: string, message: string);
5
+ }
6
+ export declare function assertInvokeInput(input: {
7
+ message?: unknown;
8
+ threadId?: unknown;
9
+ }): void;
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,IAAI,CAaP"}
package/dist/errors.js ADDED
@@ -0,0 +1,17 @@
1
+ /** Thrown when `invoke` input fails validation (e.g. missing threadId). */
2
+ export class AgentRuntimeError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = "AgentRuntimeError";
7
+ this.code = code;
8
+ }
9
+ }
10
+ export function assertInvokeInput(input) {
11
+ if (typeof input.message !== "string" || !input.message.trim()) {
12
+ throw new AgentRuntimeError("INVALID_MESSAGE", 'invoke() requires a non-empty string "message".');
13
+ }
14
+ if (typeof input.threadId !== "string" || !input.threadId.trim()) {
15
+ throw new AgentRuntimeError("MISSING_THREAD_ID", 'invoke() requires a non-empty string "threadId" so the checkpointer can persist conversation state. Example: runtime.invoke({ message, threadId: "user-123" })');
16
+ }
17
+ }
package/dist/index.d.ts CHANGED
@@ -1,11 +1,20 @@
1
1
  export { createAgentRuntime, type AgentRuntime } from "./create-runtime.js";
2
2
  export { createModels } from "./llm.js";
3
- export { llmConfigFromEnv } from "./env-llm.js";
3
+ export { llmConfigFromEnv, resolveEmbeddingsProvider, isServerlessRuntime, } from "./env-llm.js";
4
4
  export { createRedis } from "./redis.js";
5
+ export { XenovaEmbeddings } from "./embeddings/xenova.js";
6
+ export { AgentRuntimeError, assertInvokeInput } from "./errors.js";
7
+ export { GENERAL_INTENT_NAME, createGeneralIntent, createGeneralIntentBinding, withGeneralIntent, } from "./intents/general.js";
8
+ export type { WithGeneralIntentOptions } from "./intents/general.js";
9
+ export { defineIntents, withGeneralIntents } from "./intents/define.js";
10
+ export type { UnifiedIntent } from "./intents/define.js";
11
+ export { ragSourcesFromEnv, resolveRagSource, resolveRagSources, isHttpUrl, loadRagDocument, loadRagDocuments, createSimpleRagStore, createSimpleRagFromSources, createSimpleRagFromEnv, getRagStore, getRagDocumentCount, resetRagStore, } from "./rag/index.js";
12
+ export type { RagSourceKind, ResolvedRagSource, LoadedRagDocument, RagChunk, SimpleRagStore, GetRagStoreOptions, } from "./rag/index.js";
5
13
  export { extractRawToolOutputs, extractToolCallArgs, getToolCallsFromMessages, createToolOutputExtractor, } from "./services/extract.js";
6
14
  export { toolOutputMapToExtractors, createCompleteOnFinalize, } from "./services/simple-config.js";
15
+ export { extractTokenUsageFromMessages, emptyTokenCounts, addTokenCounts, } from "./services/token-usage.js";
7
16
  export { isWizardInput } from "./services/flow-router.js";
8
17
  export { getLastMessageContent } from "./utils/message.js";
9
18
  export { normalize } from "./utils/normalize.js";
10
- export type { AgentRuntimeConfig, CacheConfig, ChatFlowState, DetectedIntentResult, FinalizeFlowInput, FinalizeFlowResult, FlowResolution, FlowState, IntentBinding, IntentDefinition, IntentRegistry, InvokeInput, InvokeResult, LlmConfig, LlmIntentResult, LlmProvider, PromptContext, ToolCall, ToolExtractor, ToolExtractorMap, ToolOutputMap, TracingConfig, } from "./types.js";
19
+ export type { AgentRuntimeConfig, CacheConfig, ChatFlowState, DetectedIntentResult, EmbeddingsProvider, FinalizeFlowInput, FinalizeFlowResult, FlowResolution, FlowState, FlowTokenUsage, IntentBinding, IntentDefinition, IntentRegistry, InvokeInput, InvokeResult, LlmConfig, LlmIntentResult, LlmProvider, PromptContext, TokenCounts, TokenUsageReport, ToolCall, ToolExtractor, ToolExtractorMap, ToolOutputMap, TracingConfig, } from "./types.js";
11
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,WAAW,EACX,mBAAmB,EACnB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC"}