@chatman-media/conversation-engine 1.10.0 → 1.12.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conversations.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.integration.test.d.ts","sourceRoot":"","sources":["../../src/dal/conversations.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kb-store.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-store.integration.test.d.ts","sourceRoot":"","sources":["../../src/dal/kb-store.integration.test.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@ export { generateReplyAndEnqueue, type GenerateReplyAndEnqueueDeps, type Generat
16
16
  export { dispatchOutbound } from "./outbound-dispatch.ts";
17
17
  export { processInbound, type ProcessInboundDeps, type ReplyStrategy, } from "./process-inbound.ts";
18
18
  export type { ITranscriber } from "./transcriber.ts";
19
- export { LlmReplyStrategy, type LlmReplyStrategyOpts, parseStyleConfig, RagReplyStrategy, type RagReplyStrategyOpts, } from "./reply-strategy/index.ts";
19
+ export { EXCHANGE_SAFE_FALLBACK, guardExchangeReply, type ExchangeReplyGuardInput, type ExchangeReplyGuardResult, LlmReplyStrategy, type LlmReplyStrategyOpts, parseStyleConfig, RagReplyStrategy, type RagReplyStrategyOpts, } from "./reply-strategy/index.ts";
20
20
  export { type ChannelContext, type Clock, type PipelineEvent, type PipelineSink, type ProcessInboundResult, systemClock, type TenantContext, } from "./types.ts";
21
21
  export { withTenant } from "./with-tenant.ts";
22
22
  export { checkRlsEnforcement, type RlsRoleCheck } from "./rls-guard.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1970,6 +1970,87 @@ ${transcript}` }
1970
1970
  return raw.trim() || null;
1971
1971
  }
1972
1972
 
1973
+ // src/reply-strategy/exchange-reply-guard.ts
1974
+ var EXCHANGE_SAFE_FALLBACK = "Сейчас уточню у оператора и вернусь с точной суммой/реквизитами.";
1975
+ var QUOTE_TOOLS = new Set(["compute_exchange_quote", "create_exchange_order"]);
1976
+ var REQUISITES_TOOLS = new Set(["fetch_exchange_requisites"]);
1977
+ var PAYOUT_TOOLS = new Set(["issue_exchange_payout"]);
1978
+ var NUMBER_RE = /(?<![A-Za-zА-Яа-я0-9])(?:\d{1,3}(?:[ .,]\d{3})+|\d+)(?:[.,]\d+)?(?![A-Za-zА-Яа-я0-9])/u;
1979
+ var QUOTE_RE = /(?:курс|rate|отда[её]те|получа(?:ете|ешь)|итог(?:овая)?\s+сумм|thb|бат|bhat|rub|руб|usdt|btc|eth|usd|eur)/iu;
1980
+ var REQUISITES_RE = /(?:реквизит|кошел[её]к|wallet|адрес\s+(?:кошелька|для\s+оплаты)|оплат\w*|перев(?:од|ести)|sbp|сбп|qr|карта|card|binance\s*id|trc20|erc20|bep20)/iu;
1981
+ var PAYOUT_RE = /(?:код\s+(?:выдачи|снятия|получения)|payout\s*code|cardless|без\s+карты|банкомат|atm)/iu;
1982
+ var RATE_NEGOTIATION_RE = /(?:договор(?:имся|иться)|скидк|лучше\s+курс|курс\s+лучше|сдела(?:ю|ем)\s+курс|подвин(?:у|ем)\s+курс)/iu;
1983
+ var CRYPTO_ADDRESS_RE = /\b(?:T[A-Za-z0-9]{25,}|0x[a-fA-F0-9]{32,}|bc1[a-z0-9]{20,})\b/u;
1984
+ var CARDISH_RE = /\b(?:\d[ -]?){12,19}\b/u;
1985
+ var URL_PAYMENT_RE = /\bhttps?:\/\/\S+/iu;
1986
+ var CODE_RE = /\b\d{4,8}\b/u;
1987
+ function successfulToolNames(telemetry) {
1988
+ const names = new Set;
1989
+ const calls = telemetry?.toolCalls ?? (telemetry?.toolCall ? [{ ...telemetry.toolCall }] : []);
1990
+ for (const call of calls) {
1991
+ if (!call || "error" in call && call.error)
1992
+ continue;
1993
+ const result = call.result;
1994
+ if (isBlockingToolResult(result))
1995
+ continue;
1996
+ names.add(call.name);
1997
+ }
1998
+ return names;
1999
+ }
2000
+ function isBlockingToolResult(result) {
2001
+ if (typeof result !== "object" || result === null)
2002
+ return false;
2003
+ const obj = result;
2004
+ if (typeof obj.error === "string" && obj.error.trim())
2005
+ return true;
2006
+ if (obj.needsOperator === true)
2007
+ return true;
2008
+ if (obj.needsVerification === true)
2009
+ return true;
2010
+ if (obj.ok === false)
2011
+ return true;
2012
+ return false;
2013
+ }
2014
+ function hasAny(names, allowed) {
2015
+ for (const name of allowed) {
2016
+ if (names.has(name))
2017
+ return true;
2018
+ }
2019
+ return false;
2020
+ }
2021
+ function hasConcreteQuoteClaim(text) {
2022
+ return NUMBER_RE.test(text) && QUOTE_RE.test(text);
2023
+ }
2024
+ function hasConcreteRequisitesClaim(text) {
2025
+ if (CRYPTO_ADDRESS_RE.test(text) || CARDISH_RE.test(text))
2026
+ return true;
2027
+ if (!REQUISITES_RE.test(text))
2028
+ return false;
2029
+ return URL_PAYMENT_RE.test(text) || NUMBER_RE.test(text) || /(?:перев(?:едите|ести)|оплат(?:ите|ить)|адрес|ссылка)/iu.test(text);
2030
+ }
2031
+ function hasConcretePayoutClaim(text) {
2032
+ return PAYOUT_RE.test(text) && CODE_RE.test(text);
2033
+ }
2034
+ function guardExchangeReply(input) {
2035
+ const text = input.text.trim();
2036
+ if (!text)
2037
+ return { ok: true, text };
2038
+ if (RATE_NEGOTIATION_RE.test(text)) {
2039
+ return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "rate_negotiation" };
2040
+ }
2041
+ const tools = successfulToolNames(input.telemetry);
2042
+ if (hasConcreteQuoteClaim(text) && !hasAny(tools, QUOTE_TOOLS)) {
2043
+ return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "unbacked_quote" };
2044
+ }
2045
+ if (hasConcreteRequisitesClaim(text) && !hasAny(tools, REQUISITES_TOOLS)) {
2046
+ return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "unbacked_requisites" };
2047
+ }
2048
+ if (hasConcretePayoutClaim(text) && !hasAny(tools, PAYOUT_TOOLS)) {
2049
+ return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "unbacked_payout_code" };
2050
+ }
2051
+ return { ok: true, text };
2052
+ }
2053
+
1973
2054
  // src/reply-strategy/rag-reply.ts
1974
2055
  function messagesToChatHistory(history) {
1975
2056
  const out = [];
@@ -2049,12 +2130,17 @@ class RagReplyStrategy {
2049
2130
  const [skills, directorHooks, tools, reranker, stageGuidance, requestContext, awaitingOperator] = await Promise.all([
2050
2131
  this.opts.resolveSkills ? this.opts.resolveSkills({ tenantId }) : Promise.resolve([]),
2051
2132
  this.opts.resolveDirectorHooks ? this.opts.resolveDirectorHooks({ tenantId }) : Promise.resolve([]),
2052
- this.opts.resolveTools ? this.opts.resolveTools({ tenantId, conversationId: input.conversationId }) : Promise.resolve([]),
2133
+ this.opts.resolveTools ? this.opts.resolveTools({
2134
+ tenantId,
2135
+ conversationId: input.conversationId,
2136
+ contactId: input.contactId
2137
+ }) : Promise.resolve([]),
2053
2138
  this.opts.resolveReranker ? this.opts.resolveReranker({ tenantId }) : Promise.resolve(null),
2054
2139
  this.opts.resolveStageGuidance ? this.opts.resolveStageGuidance({ tenantId, contactId: input.contactId }) : Promise.resolve(null),
2055
2140
  this.opts.resolveRequestContext ? this.opts.resolveRequestContext({ tenantId, contactId: input.contactId }) : Promise.resolve(null),
2056
2141
  this.opts.resolveAwaitingOperator ? this.opts.resolveAwaitingOperator({ tenantId, contactId: input.contactId }) : Promise.resolve(false)
2057
2142
  ]);
2143
+ const isExchange = this.opts.template?.slug === "exchange_v1";
2058
2144
  const result = await answerWithRag({
2059
2145
  question: input.userMessageText,
2060
2146
  kb,
@@ -2064,7 +2150,7 @@ class RagReplyStrategy {
2064
2150
  topK: this.opts.topK ?? 5,
2065
2151
  hybridSearch: this.opts.hybridSearch ?? true,
2066
2152
  rewriteQueryBeforeRetrieval: this.opts.rewriteQueryBeforeRetrieval ?? true,
2067
- reflect: this.opts.reflect ?? false,
2153
+ reflect: this.opts.reflect ?? isExchange,
2068
2154
  numPredict: this.opts.maxOutputTokens ?? 600,
2069
2155
  ...style ? { style } : {},
2070
2156
  ...skills.length > 0 ? { skills } : {},
@@ -2088,6 +2174,16 @@ class RagReplyStrategy {
2088
2174
  console.warn("[rag-reply] failed to log kb_suggestion:", err);
2089
2175
  });
2090
2176
  }
2177
+ if (isExchange) {
2178
+ console.warn(`[exchange-reflect-guard] tenant=${tenantId} conversation=${input.conversationId} path=${result.telemetry.path}`);
2179
+ return [
2180
+ {
2181
+ channelId: String(input.channel.channelId),
2182
+ externalUserId: input.inbound.externalUserId,
2183
+ parts: [{ kind: "text", text: EXCHANGE_SAFE_FALLBACK }]
2184
+ }
2185
+ ];
2186
+ }
2091
2187
  if (!this.opts.softFallback)
2092
2188
  return null;
2093
2189
  const persona = style ? {
@@ -2111,11 +2207,15 @@ class RagReplyStrategy {
2111
2207
  }
2112
2208
  ];
2113
2209
  }
2210
+ const guarded = isExchange ? guardExchangeReply({ text: result.text, telemetry: result.telemetry }) : { ok: true, text: result.text };
2211
+ if (!guarded.ok) {
2212
+ console.warn(`[exchange-reply-guard] tenant=${tenantId} conversation=${input.conversationId} reason=${guarded.reason ?? "unknown"}`);
2213
+ }
2114
2214
  return [
2115
2215
  {
2116
2216
  channelId: String(input.channel.channelId),
2117
2217
  externalUserId: input.inbound.externalUserId,
2118
- parts: [{ kind: "text", text: result.text }]
2218
+ parts: [{ kind: "text", text: guarded.text }]
2119
2219
  }
2120
2220
  ];
2121
2221
  }
@@ -2721,7 +2821,11 @@ async function processInbound(inbound, deps) {
2721
2821
  };
2722
2822
  }
2723
2823
  // src/reply-strategy/llm-reply.ts
2724
- import { DEFAULT_MAX_TOOL_CYCLES, runToolLoop } from "@chatman-media/kb";
2824
+ import {
2825
+ buildToolTelemetry,
2826
+ DEFAULT_MAX_TOOL_CYCLES,
2827
+ runToolLoop
2828
+ } from "@chatman-media/kb";
2725
2829
  var BASE_SYSTEM_PROMPT = "Ты — операционный бот платформы lead-engine. Отвечай кратко, " + "уважительно, по делу. Никогда не выдумывай факты которых нет в " + "контексте — лучше скажи «уточню у партнёра» и поставь сообщение в очередь оператора.";
2726
2830
  function messagesToChatHistory2(history) {
2727
2831
  const out = [];
@@ -2765,7 +2869,8 @@ class LlmReplyStrategy {
2765
2869
  try {
2766
2870
  tools = await this.opts.resolveTools({
2767
2871
  tenantId: input.tenant.tenantId,
2768
- conversationId: input.conversationId
2872
+ conversationId: input.conversationId,
2873
+ contactId: input.contactId
2769
2874
  });
2770
2875
  } catch {
2771
2876
  tools = [];
@@ -2784,6 +2889,7 @@ class LlmReplyStrategy {
2784
2889
  ...historyMessages
2785
2890
  ];
2786
2891
  let reply;
2892
+ let toolCalls = [];
2787
2893
  if (toolsActive) {
2788
2894
  const loop = await runToolLoop({
2789
2895
  chat,
@@ -2792,17 +2898,22 @@ class LlmReplyStrategy {
2792
2898
  llmOpts,
2793
2899
  maxCycles: DEFAULT_MAX_TOOL_CYCLES
2794
2900
  });
2901
+ toolCalls = loop.toolCalls;
2795
2902
  reply = loop.content ?? await chat.complete(msgs, llmOpts);
2796
2903
  } else {
2797
2904
  reply = await chat.complete(msgs, llmOpts);
2798
2905
  }
2799
2906
  if (reply.trim().length === 0)
2800
2907
  return null;
2908
+ const guarded = this.opts.template.slug === "exchange_v1" ? guardExchangeReply({ text: reply, telemetry: buildToolTelemetry(toolCalls) }) : { ok: true, text: reply };
2909
+ if (!guarded.ok) {
2910
+ console.warn(`[exchange-reply-guard] tenant=${input.tenant.tenantId} conversation=${input.conversationId} reason=${guarded.reason ?? "unknown"}`);
2911
+ }
2801
2912
  return [
2802
2913
  {
2803
2914
  channelId: String(input.channel.channelId),
2804
2915
  externalUserId: input.inbound.externalUserId,
2805
- parts: [{ kind: "text", text: reply }]
2916
+ parts: [{ kind: "text", text: guarded.text }]
2806
2917
  }
2807
2918
  ];
2808
2919
  }
@@ -2854,6 +2965,7 @@ export {
2854
2965
  loadExperimentVariants,
2855
2966
  isTerminal,
2856
2967
  isMuted,
2968
+ guardExchangeReply,
2857
2969
  getInitialStage,
2858
2970
  getDecryptedSecret,
2859
2971
  generateReplyAndEnqueue,
@@ -2883,6 +2995,7 @@ export {
2883
2995
  INFORMER_TOPICS,
2884
2996
  FunnelTransitionError,
2885
2997
  ExperimentsRepo,
2998
+ EXCHANGE_SAFE_FALLBACK,
2886
2999
  DrizzleKbStore,
2887
3000
  ConversationsRepo,
2888
3001
  ContactsRepo,
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lead-advance.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lead-advance.integration.test.d.ts","sourceRoot":"","sources":["../src/lead-advance.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { AnswerTelemetry } from "@chatman-media/kb";
2
+ export declare const EXCHANGE_SAFE_FALLBACK = "\u0421\u0435\u0439\u0447\u0430\u0441 \u0443\u0442\u043E\u0447\u043D\u044E \u0443 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u0438 \u0432\u0435\u0440\u043D\u0443\u0441\u044C \u0441 \u0442\u043E\u0447\u043D\u043E\u0439 \u0441\u0443\u043C\u043C\u043E\u0439/\u0440\u0435\u043A\u0432\u0438\u0437\u0438\u0442\u0430\u043C\u0438.";
3
+ export interface ExchangeReplyGuardInput {
4
+ text: string;
5
+ telemetry?: Pick<AnswerTelemetry, "toolCall" | "toolCalls">;
6
+ }
7
+ export interface ExchangeReplyGuardResult {
8
+ ok: boolean;
9
+ text: string;
10
+ reason?: string;
11
+ }
12
+ export declare function guardExchangeReply(input: ExchangeReplyGuardInput): ExchangeReplyGuardResult;
13
+ //# sourceMappingURL=exchange-reply-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange-reply-guard.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/exchange-reply-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,eAAO,MAAM,sBAAsB,mVACiC,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAuB3F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exchange-reply-guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange-reply-guard.test.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/exchange-reply-guard.test.ts"],"names":[],"mappings":""}
@@ -1,3 +1,4 @@
1
1
  export { LlmReplyStrategy, type LlmReplyStrategyOpts } from "./llm-reply.ts";
2
2
  export { parseStyleConfig, RagReplyStrategy, type RagReplyStrategyOpts } from "./rag-reply.ts";
3
+ export { EXCHANGE_SAFE_FALLBACK, guardExchangeReply, type ExchangeReplyGuardInput, type ExchangeReplyGuardResult, } from "./exchange-reply-guard.ts";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC"}
@@ -56,6 +56,7 @@ export interface LlmReplyStrategyOpts {
56
56
  resolveTools?: (input: {
57
57
  tenantId: number;
58
58
  conversationId: number;
59
+ contactId?: number;
59
60
  }) => Promise<AnyRagTool[]> | AnyRagTool[];
60
61
  }
61
62
  export declare class LlmReplyStrategy implements ReplyStrategy {
@@ -1 +1 @@
1
- {"version":3,"file":"llm-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/llm-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,KAAK,UAAU,EAAwC,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC;IAC9C,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC;CAC5C;AAkBD,qBAAa,gBAAiB,YAAW,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,IAAI,EAAE,oBAAoB,EAC1B,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,YAAY;IAGhE,QAAQ,CAAC,KAAK,EAAE;QACpB,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE;YAAE,cAAc,EAAE,MAAM,CAAA;SAAE,CAAC;QACpC,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC;CA8EvC"}
1
+ {"version":3,"file":"llm-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/llm-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EACL,KAAK,UAAU,EAKhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC;IAC9C,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC;CAC5C;AAkBD,qBAAa,gBAAiB,YAAW,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,IAAI,EAAE,oBAAoB,EAC1B,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,YAAY;IAGhE,QAAQ,CAAC,KAAK,EAAE;QACpB,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE;YAAE,cAAc,EAAE,MAAM,CAAA;SAAE,CAAC;QACpC,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC;CAyFvC"}
@@ -134,6 +134,7 @@ export interface RagReplyStrategyOpts {
134
134
  resolveTools?: (input: {
135
135
  tenantId: number;
136
136
  conversationId: number;
137
+ contactId?: number;
137
138
  }) => Promise<AnyRagTool[]> | AnyRagTool[];
138
139
  /**
139
140
  * Если true — когда RAG не находит контекста (NO_CONTEXT_MARKER) бот всё
@@ -1 +1 @@
1
- {"version":3,"file":"rag-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/rag-reply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rag-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/rag-reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rag-reply.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-reply.test.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/rag-reply.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chatman-media/conversation-engine",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
4
4
  "description": "Channel-agnostic pipeline обработки inbound сообщений: contact-resolve → conversation lookup → mode routing → AI-reply / queued / human → outbound. Сердце data plane.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,7 +38,7 @@
38
38
  "@chatman-media/channel-telegram": "1.1.0",
39
39
  "@chatman-media/llm-router": "1.1.1",
40
40
  "@chatman-media/kb": "1.5.0",
41
- "@chatman-media/storage": "1.9.0",
41
+ "@chatman-media/storage": "1.10.1",
42
42
  "@chatman-media/verticals": "1.2.0"
43
43
  },
44
44
  "peerDependencies": {