@kilnai/runtime 0.1.15 → 0.9.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 (249) hide show
  1. package/README.md +7 -3
  2. package/dist/channels/email-api.d.ts +29 -0
  3. package/dist/channels/email-api.d.ts.map +1 -0
  4. package/dist/channels/email-api.js +133 -0
  5. package/dist/channels/email-api.js.map +1 -0
  6. package/dist/channels/email-channel.d.ts +26 -0
  7. package/dist/channels/email-channel.d.ts.map +1 -0
  8. package/dist/channels/email-channel.js +59 -0
  9. package/dist/channels/email-channel.js.map +1 -0
  10. package/dist/channels/email-template.d.ts +10 -0
  11. package/dist/channels/email-template.d.ts.map +1 -0
  12. package/dist/channels/email-template.js +63 -0
  13. package/dist/channels/email-template.js.map +1 -0
  14. package/dist/channels/instagram-api.d.ts +29 -0
  15. package/dist/channels/instagram-api.d.ts.map +1 -0
  16. package/dist/channels/instagram-api.js +75 -0
  17. package/dist/channels/instagram-api.js.map +1 -0
  18. package/dist/channels/instagram-channel.d.ts +24 -0
  19. package/dist/channels/instagram-channel.d.ts.map +1 -0
  20. package/dist/channels/instagram-channel.js +55 -0
  21. package/dist/channels/instagram-channel.js.map +1 -0
  22. package/dist/channels/message-formatter.d.ts +17 -0
  23. package/dist/channels/message-formatter.d.ts.map +1 -1
  24. package/dist/channels/message-formatter.js +27 -0
  25. package/dist/channels/message-formatter.js.map +1 -1
  26. package/dist/channels/messenger-api.d.ts +27 -0
  27. package/dist/channels/messenger-api.d.ts.map +1 -0
  28. package/dist/channels/messenger-api.js +75 -0
  29. package/dist/channels/messenger-api.js.map +1 -0
  30. package/dist/channels/messenger-channel.d.ts +23 -0
  31. package/dist/channels/messenger-channel.d.ts.map +1 -0
  32. package/dist/channels/messenger-channel.js +55 -0
  33. package/dist/channels/messenger-channel.js.map +1 -0
  34. package/dist/channels/web-channel.d.ts +2 -0
  35. package/dist/channels/web-channel.d.ts.map +1 -1
  36. package/dist/channels/web-channel.js +9 -0
  37. package/dist/channels/web-channel.js.map +1 -1
  38. package/dist/enrichment/enrichment-runner.d.ts +17 -0
  39. package/dist/enrichment/enrichment-runner.d.ts.map +1 -0
  40. package/dist/enrichment/enrichment-runner.js +45 -0
  41. package/dist/enrichment/enrichment-runner.js.map +1 -0
  42. package/dist/enrichment/sqlite-enrichment-store.d.ts +14 -0
  43. package/dist/enrichment/sqlite-enrichment-store.d.ts.map +1 -0
  44. package/dist/enrichment/sqlite-enrichment-store.js +69 -0
  45. package/dist/enrichment/sqlite-enrichment-store.js.map +1 -0
  46. package/dist/gateway/audio-preprocessor.d.ts +11 -0
  47. package/dist/gateway/audio-preprocessor.d.ts.map +1 -0
  48. package/dist/gateway/audio-preprocessor.js +76 -0
  49. package/dist/gateway/audio-preprocessor.js.map +1 -0
  50. package/dist/gateway/auth-middleware.d.ts.map +1 -1
  51. package/dist/gateway/auth-middleware.js +10 -2
  52. package/dist/gateway/auth-middleware.js.map +1 -1
  53. package/dist/gateway/contact-memory-admin-routes.d.ts +9 -0
  54. package/dist/gateway/contact-memory-admin-routes.d.ts.map +1 -0
  55. package/dist/gateway/contact-memory-admin-routes.js +42 -0
  56. package/dist/gateway/contact-memory-admin-routes.js.map +1 -0
  57. package/dist/gateway/context-formatter.d.ts +5 -0
  58. package/dist/gateway/context-formatter.d.ts.map +1 -0
  59. package/dist/gateway/context-formatter.js +16 -0
  60. package/dist/gateway/context-formatter.js.map +1 -0
  61. package/dist/gateway/conversation-event-emitter.d.ts +4 -1
  62. package/dist/gateway/conversation-event-emitter.d.ts.map +1 -1
  63. package/dist/gateway/conversation-event-emitter.js +44 -13
  64. package/dist/gateway/conversation-event-emitter.js.map +1 -1
  65. package/dist/gateway/dev-routes.d.ts +1 -1
  66. package/dist/gateway/dev-routes.d.ts.map +1 -1
  67. package/dist/gateway/dev-routes.js +2 -2
  68. package/dist/gateway/dev-routes.js.map +1 -1
  69. package/dist/gateway/email-loop-guard.d.ts +10 -0
  70. package/dist/gateway/email-loop-guard.d.ts.map +1 -0
  71. package/dist/gateway/email-loop-guard.js +39 -0
  72. package/dist/gateway/email-loop-guard.js.map +1 -0
  73. package/dist/gateway/email-thread-store.d.ts +24 -0
  74. package/dist/gateway/email-thread-store.d.ts.map +1 -0
  75. package/dist/gateway/email-thread-store.js +34 -0
  76. package/dist/gateway/email-thread-store.js.map +1 -0
  77. package/dist/gateway/email-webhook-routes.d.ts +32 -0
  78. package/dist/gateway/email-webhook-routes.d.ts.map +1 -0
  79. package/dist/gateway/email-webhook-routes.js +411 -0
  80. package/dist/gateway/email-webhook-routes.js.map +1 -0
  81. package/dist/gateway/enrichment-admin-routes.d.ts +9 -0
  82. package/dist/gateway/enrichment-admin-routes.d.ts.map +1 -0
  83. package/dist/gateway/enrichment-admin-routes.js +41 -0
  84. package/dist/gateway/enrichment-admin-routes.js.map +1 -0
  85. package/dist/gateway/gateway-routes.d.ts +17 -1
  86. package/dist/gateway/gateway-routes.d.ts.map +1 -1
  87. package/dist/gateway/gateway-routes.js +55 -1
  88. package/dist/gateway/gateway-routes.js.map +1 -1
  89. package/dist/gateway/gateway-server.d.ts.map +1 -1
  90. package/dist/gateway/gateway-server.js +250 -14
  91. package/dist/gateway/gateway-server.js.map +1 -1
  92. package/dist/gateway/handoff-routes.d.ts +15 -0
  93. package/dist/gateway/handoff-routes.d.ts.map +1 -0
  94. package/dist/gateway/handoff-routes.js +253 -0
  95. package/dist/gateway/handoff-routes.js.map +1 -0
  96. package/dist/gateway/instagram-webhook-routes.d.ts +30 -0
  97. package/dist/gateway/instagram-webhook-routes.d.ts.map +1 -0
  98. package/dist/gateway/instagram-webhook-routes.js +394 -0
  99. package/dist/gateway/instagram-webhook-routes.js.map +1 -0
  100. package/dist/gateway/knowledge-admin-routes.d.ts +9 -0
  101. package/dist/gateway/knowledge-admin-routes.d.ts.map +1 -0
  102. package/dist/gateway/knowledge-admin-routes.js +84 -0
  103. package/dist/gateway/knowledge-admin-routes.js.map +1 -0
  104. package/dist/gateway/knowledge-factory.d.ts +19 -0
  105. package/dist/gateway/knowledge-factory.d.ts.map +1 -0
  106. package/dist/gateway/knowledge-factory.js +122 -0
  107. package/dist/gateway/knowledge-factory.js.map +1 -0
  108. package/dist/gateway/message-pipeline.d.ts +69 -0
  109. package/dist/gateway/message-pipeline.d.ts.map +1 -0
  110. package/dist/gateway/message-pipeline.js +185 -0
  111. package/dist/gateway/message-pipeline.js.map +1 -0
  112. package/dist/gateway/messenger-webhook-routes.d.ts +30 -0
  113. package/dist/gateway/messenger-webhook-routes.d.ts.map +1 -0
  114. package/dist/gateway/messenger-webhook-routes.js +394 -0
  115. package/dist/gateway/messenger-webhook-routes.js.map +1 -0
  116. package/dist/gateway/meta-webhook-foundation.d.ts +12 -0
  117. package/dist/gateway/meta-webhook-foundation.d.ts.map +1 -0
  118. package/dist/gateway/meta-webhook-foundation.js +25 -0
  119. package/dist/gateway/meta-webhook-foundation.js.map +1 -0
  120. package/dist/gateway/mode-b-routes.d.ts +8 -0
  121. package/dist/gateway/mode-b-routes.d.ts.map +1 -1
  122. package/dist/gateway/mode-b-routes.js +74 -36
  123. package/dist/gateway/mode-b-routes.js.map +1 -1
  124. package/dist/gateway/outbound-routes.d.ts.map +1 -1
  125. package/dist/gateway/outbound-routes.js +49 -21
  126. package/dist/gateway/outbound-routes.js.map +1 -1
  127. package/dist/gateway/routing-test-routes.d.ts +10 -0
  128. package/dist/gateway/routing-test-routes.d.ts.map +1 -0
  129. package/dist/gateway/routing-test-routes.js +76 -0
  130. package/dist/gateway/routing-test-routes.js.map +1 -0
  131. package/dist/gateway/sqlite-email-thread-store.d.ts +13 -0
  132. package/dist/gateway/sqlite-email-thread-store.d.ts.map +1 -0
  133. package/dist/gateway/sqlite-email-thread-store.js +66 -0
  134. package/dist/gateway/sqlite-email-thread-store.js.map +1 -0
  135. package/dist/gateway/stt-factory.d.ts +3 -0
  136. package/dist/gateway/stt-factory.d.ts.map +1 -0
  137. package/dist/gateway/stt-factory.js +21 -0
  138. package/dist/gateway/stt-factory.js.map +1 -0
  139. package/dist/gateway/tenant-admin-routes.d.ts.map +1 -1
  140. package/dist/gateway/tenant-admin-routes.js +17 -3
  141. package/dist/gateway/tenant-admin-routes.js.map +1 -1
  142. package/dist/gateway/tenant-routes.d.ts.map +1 -1
  143. package/dist/gateway/tenant-routes.js +18 -27
  144. package/dist/gateway/tenant-routes.js.map +1 -1
  145. package/dist/gateway/tenant-tool-factory.d.ts +10 -0
  146. package/dist/gateway/tenant-tool-factory.d.ts.map +1 -0
  147. package/dist/gateway/tenant-tool-factory.js +55 -0
  148. package/dist/gateway/tenant-tool-factory.js.map +1 -0
  149. package/dist/gateway/trace-context.d.ts +8 -0
  150. package/dist/gateway/trace-context.d.ts.map +1 -0
  151. package/dist/gateway/trace-context.js +17 -0
  152. package/dist/gateway/trace-context.js.map +1 -0
  153. package/dist/gateway/webhook-dedup.d.ts +13 -0
  154. package/dist/gateway/webhook-dedup.d.ts.map +1 -0
  155. package/dist/gateway/webhook-dedup.js +37 -0
  156. package/dist/gateway/webhook-dedup.js.map +1 -0
  157. package/dist/gateway/webhook-tool-executor.d.ts +17 -0
  158. package/dist/gateway/webhook-tool-executor.d.ts.map +1 -0
  159. package/dist/gateway/webhook-tool-executor.js +69 -0
  160. package/dist/gateway/webhook-tool-executor.js.map +1 -0
  161. package/dist/gateway/whatsapp-webhook-routes.d.ts +11 -0
  162. package/dist/gateway/whatsapp-webhook-routes.d.ts.map +1 -1
  163. package/dist/gateway/whatsapp-webhook-routes.js +205 -33
  164. package/dist/gateway/whatsapp-webhook-routes.js.map +1 -1
  165. package/dist/gateway/ws-tenant-routes.d.ts +9 -0
  166. package/dist/gateway/ws-tenant-routes.d.ts.map +1 -1
  167. package/dist/gateway/ws-tenant-routes.js +184 -7
  168. package/dist/gateway/ws-tenant-routes.js.map +1 -1
  169. package/dist/index.d.ts +63 -3
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +39 -1
  172. package/dist/index.js.map +1 -1
  173. package/dist/observability/composite-event-store.d.ts +13 -0
  174. package/dist/observability/composite-event-store.d.ts.map +1 -0
  175. package/dist/observability/composite-event-store.js +37 -0
  176. package/dist/observability/composite-event-store.js.map +1 -0
  177. package/dist/observability/prometheus-collector.d.ts +33 -0
  178. package/dist/observability/prometheus-collector.d.ts.map +1 -0
  179. package/dist/observability/prometheus-collector.js +170 -0
  180. package/dist/observability/prometheus-collector.js.map +1 -0
  181. package/dist/session/agent-handoff-summarizer.d.ts +11 -0
  182. package/dist/session/agent-handoff-summarizer.d.ts.map +1 -0
  183. package/dist/session/agent-handoff-summarizer.js +26 -0
  184. package/dist/session/agent-handoff-summarizer.js.map +1 -0
  185. package/dist/session/context-summarizer.d.ts +11 -0
  186. package/dist/session/context-summarizer.d.ts.map +1 -0
  187. package/dist/session/context-summarizer.js +23 -0
  188. package/dist/session/context-summarizer.js.map +1 -0
  189. package/dist/session/escalation-detector.d.ts +27 -0
  190. package/dist/session/escalation-detector.d.ts.map +1 -0
  191. package/dist/session/escalation-detector.js +75 -0
  192. package/dist/session/escalation-detector.js.map +1 -0
  193. package/dist/session/in-memory-session-store.d.ts +11 -0
  194. package/dist/session/in-memory-session-store.d.ts.map +1 -0
  195. package/dist/session/in-memory-session-store.js +26 -0
  196. package/dist/session/in-memory-session-store.js.map +1 -0
  197. package/dist/session/mode-b-orchestrator.d.ts +54 -1
  198. package/dist/session/mode-b-orchestrator.d.ts.map +1 -1
  199. package/dist/session/mode-b-orchestrator.js +349 -17
  200. package/dist/session/mode-b-orchestrator.js.map +1 -1
  201. package/dist/session/mode-b-session.d.ts +48 -1
  202. package/dist/session/mode-b-session.d.ts.map +1 -1
  203. package/dist/session/mode-b-session.js +105 -0
  204. package/dist/session/mode-b-session.js.map +1 -1
  205. package/dist/session/redis-session-store.d.ts +22 -0
  206. package/dist/session/redis-session-store.d.ts.map +1 -0
  207. package/dist/session/redis-session-store.js +44 -0
  208. package/dist/session/redis-session-store.js.map +1 -0
  209. package/dist/session/session-mode.d.ts +4 -0
  210. package/dist/session/session-mode.d.ts.map +1 -0
  211. package/dist/session/session-mode.js +20 -0
  212. package/dist/session/session-mode.js.map +1 -0
  213. package/dist/session/session-registry.d.ts +17 -9
  214. package/dist/session/session-registry.d.ts.map +1 -1
  215. package/dist/session/session-registry.js +80 -29
  216. package/dist/session/session-registry.js.map +1 -1
  217. package/dist/session/session-serializer.d.ts +4 -0
  218. package/dist/session/session-serializer.d.ts.map +1 -0
  219. package/dist/session/session-serializer.js +26 -0
  220. package/dist/session/session-serializer.js.map +1 -0
  221. package/dist/session/session-store.d.ts +9 -0
  222. package/dist/session/session-store.d.ts.map +1 -0
  223. package/dist/session/session-store.js +2 -0
  224. package/dist/session/session-store.js.map +1 -0
  225. package/dist/tenant/agent-resolver.d.ts +26 -0
  226. package/dist/tenant/agent-resolver.d.ts.map +1 -0
  227. package/dist/tenant/agent-resolver.js +232 -0
  228. package/dist/tenant/agent-resolver.js.map +1 -0
  229. package/dist/tenant/ping-pong-guard.d.ts +9 -0
  230. package/dist/tenant/ping-pong-guard.d.ts.map +1 -0
  231. package/dist/tenant/ping-pong-guard.js +30 -0
  232. package/dist/tenant/ping-pong-guard.js.map +1 -0
  233. package/dist/tenant/system-prompt-builder.d.ts +1 -1
  234. package/dist/tenant/system-prompt-builder.d.ts.map +1 -1
  235. package/dist/tenant/system-prompt-builder.js +13 -1
  236. package/dist/tenant/system-prompt-builder.js.map +1 -1
  237. package/dist/tenant/tenant-registry.d.ts +3 -0
  238. package/dist/tenant/tenant-registry.d.ts.map +1 -1
  239. package/dist/tenant/tenant-registry.js +83 -4
  240. package/dist/tenant/tenant-registry.js.map +1 -1
  241. package/dist/tenant/tenant-router.d.ts +27 -0
  242. package/dist/tenant/tenant-router.d.ts.map +1 -0
  243. package/dist/tenant/tenant-router.js +72 -0
  244. package/dist/tenant/tenant-router.js.map +1 -0
  245. package/dist/utils/hmac.d.ts +1 -0
  246. package/dist/utils/hmac.d.ts.map +1 -1
  247. package/dist/utils/hmac.js +3 -0
  248. package/dist/utils/hmac.js.map +1 -1
  249. package/package.json +7 -3
@@ -0,0 +1,122 @@
1
+ // Knowledge pipeline factory -- resolves KnowledgeConfig to concrete pipeline
2
+ import { OpenAIEmbeddingAdapter, OllamaEmbeddingAdapter, InMemoryVectorStore, RecursiveTextChunker, MarkdownChunker, RetrievalPipeline, KilnError, createPgVectorStore, ContextualEnricher, AnthropicAdapter, OpenAIAdapter, DeepSeekAdapter, OllamaAdapter, SourceManager, FileExtractor, UrlExtractor, PdfExtractor, CompositeExtractor, InMemorySourceStore, JsonSourceStore, ContactMemoryServiceImpl, CohereReranker, } from "@kilnai/core";
3
+ export async function createKnowledgePipeline(config) {
4
+ // Fail-fast: validate API key for non-ollama providers
5
+ if (config.embedding.provider !== "ollama" && config.embedding.apiKeyEnv) {
6
+ const apiKey = process.env[config.embedding.apiKeyEnv] ?? "";
7
+ if (!apiKey) {
8
+ throw new KilnError("CONFIG_MISSING_ENV", `Embedding provider "${config.embedding.provider}" requires API key from env var "${config.embedding.apiKeyEnv}"`, {
9
+ context: { provider: config.embedding.provider, apiKeyEnv: config.embedding.apiKeyEnv },
10
+ });
11
+ }
12
+ }
13
+ // Resolve embedding adapter
14
+ const embedder = config.embedding.provider === "openai"
15
+ ? new OpenAIEmbeddingAdapter({
16
+ apiKey: config.embedding.apiKeyEnv ? process.env[config.embedding.apiKeyEnv] ?? "" : "",
17
+ model: config.embedding.model,
18
+ })
19
+ : new OllamaEmbeddingAdapter({
20
+ model: config.embedding.model,
21
+ baseUrl: config.embedding.baseUrl,
22
+ });
23
+ // Resolve vector store
24
+ let store;
25
+ let closeFn = async () => { };
26
+ if (config.store.backend === "pgvector") {
27
+ if (!config.store.connectionString) {
28
+ throw new KilnError("CONFIG_INVALID", "pgvector backend requires connectionString", {
29
+ context: { backend: "pgvector" },
30
+ });
31
+ }
32
+ const pgStore = await createPgVectorStore({ connectionString: config.store.connectionString });
33
+ await pgStore.initialize();
34
+ store = pgStore;
35
+ closeFn = () => pgStore.close();
36
+ }
37
+ else {
38
+ store = new InMemoryVectorStore();
39
+ }
40
+ // Resolve chunker
41
+ const chunker = config.chunking.strategy === "markdown"
42
+ ? new MarkdownChunker()
43
+ : new RecursiveTextChunker();
44
+ // Resolve contextual enricher (optional)
45
+ let enricher;
46
+ if (config.chunking.contextual?.enabled) {
47
+ const ctx = config.chunking.contextual;
48
+ const apiKey = ctx.apiKeyEnv ? process.env[ctx.apiKeyEnv] ?? "" : "";
49
+ const provider = ctx.provider === "anthropic"
50
+ ? new AnthropicAdapter({ apiKey, defaultModel: ctx.model })
51
+ : ctx.provider === "openai"
52
+ ? new OpenAIAdapter({ apiKey, defaultModel: ctx.model })
53
+ : ctx.provider === "deepseek"
54
+ ? new DeepSeekAdapter({ apiKey, defaultModel: ctx.model })
55
+ : new OllamaAdapter({ baseUrl: ctx.baseUrl, defaultModel: ctx.model });
56
+ enricher = new ContextualEnricher({
57
+ provider,
58
+ concurrency: ctx.concurrency,
59
+ });
60
+ }
61
+ // Resolve reranker (optional)
62
+ let reranker;
63
+ if (config.reranker) {
64
+ const apiKey = process.env[config.reranker.apiKeyEnv] ?? "";
65
+ if (!apiKey) {
66
+ throw new KilnError("CONFIG_MISSING_ENV", `Reranker provider "${config.reranker.provider}" requires API key from env var "${config.reranker.apiKeyEnv}"`, {
67
+ context: { provider: config.reranker.provider, apiKeyEnv: config.reranker.apiKeyEnv },
68
+ });
69
+ }
70
+ reranker = new CohereReranker({ apiKey, model: config.reranker.model });
71
+ }
72
+ const pipeline = new RetrievalPipeline({
73
+ embedder,
74
+ store,
75
+ chunker,
76
+ chunkConfig: {
77
+ chunkSize: config.chunking.chunkSize ?? 512,
78
+ chunkOverlap: config.chunking.chunkOverlap ?? 50,
79
+ },
80
+ enricher,
81
+ reranker,
82
+ });
83
+ return { pipeline, store, embedder, close: closeFn };
84
+ }
85
+ export function createContactMemoryService(config) {
86
+ const apiKey = config.contactMemoryConfig.apiKeyEnv
87
+ ? process.env[config.contactMemoryConfig.apiKeyEnv] ?? ""
88
+ : "";
89
+ const provider = config.contactMemoryConfig.provider === "anthropic"
90
+ ? new AnthropicAdapter({ apiKey, defaultModel: config.contactMemoryConfig.model })
91
+ : config.contactMemoryConfig.provider === "openai"
92
+ ? new OpenAIAdapter({ apiKey, defaultModel: config.contactMemoryConfig.model })
93
+ : config.contactMemoryConfig.provider === "deepseek"
94
+ ? new DeepSeekAdapter({ apiKey, defaultModel: config.contactMemoryConfig.model })
95
+ : new OllamaAdapter({
96
+ baseUrl: config.contactMemoryConfig.baseUrl,
97
+ defaultModel: config.contactMemoryConfig.model,
98
+ });
99
+ return new ContactMemoryServiceImpl({
100
+ vectorStore: config.vectorStore,
101
+ embedder: config.embedder,
102
+ provider,
103
+ });
104
+ }
105
+ export function createSourceManager(pipeline, store, storageDir) {
106
+ const extractor = new CompositeExtractor([
107
+ new FileExtractor(),
108
+ new UrlExtractor(),
109
+ new PdfExtractor(),
110
+ ]);
111
+ const sourceStore = storageDir
112
+ ? new JsonSourceStore(storageDir)
113
+ : new InMemorySourceStore();
114
+ const sourceManager = new SourceManager({
115
+ sourceStore,
116
+ extractor,
117
+ pipeline,
118
+ vectorStore: store,
119
+ });
120
+ return { sourceManager };
121
+ }
122
+ //# sourceMappingURL=knowledge-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-factory.js","sourceRoot":"","sources":["../../src/gateway/knowledge-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { ContentPart } from "@kilnai/core";
2
+ import type { ModeBOrchestrator, PerCallToolConfig, ToolExecutionSummary } from "../session/mode-b-orchestrator.js";
3
+ import type { SessionRegistry } from "../session/session-registry.js";
4
+ import type { BillingConfig } from "./budget-middleware.js";
5
+ import type { ConversationEventEmitter } from "./conversation-event-emitter.js";
6
+ import type { SessionMode } from "../session/session-mode.js";
7
+ import type { EscalationSignal } from "../session/escalation-detector.js";
8
+ export interface InboundMessageContext {
9
+ readonly orchestrator: ModeBOrchestrator;
10
+ readonly sessionRegistry: SessionRegistry;
11
+ readonly appName: string;
12
+ readonly tenantId?: string;
13
+ readonly userId: string;
14
+ readonly systemPrompt: string;
15
+ readonly userParts: readonly ContentPart[];
16
+ readonly billing?: BillingConfig;
17
+ readonly eventEmitter?: ConversationEventEmitter;
18
+ readonly channel: string;
19
+ readonly idleTimeoutMs?: number;
20
+ readonly recalledMemory?: string;
21
+ readonly knowledgeContext?: string;
22
+ readonly contactContext?: string;
23
+ readonly callBuiltinTools?: ReadonlyMap<string, (input: Record<string, unknown>) => Promise<unknown>>;
24
+ readonly perCallConfig?: PerCallToolConfig;
25
+ readonly traceId?: string;
26
+ readonly activeAgentId?: string;
27
+ readonly activeAgentName?: string;
28
+ readonly isHandoff?: boolean;
29
+ readonly previousAgentId?: string;
30
+ readonly previousAgentName?: string;
31
+ readonly handoffBrief?: string;
32
+ readonly pingPongBlocked?: boolean;
33
+ readonly pingPongReason?: string;
34
+ readonly routingTier?: "rule" | "embedding" | "fallback";
35
+ readonly routingConfidence?: number;
36
+ }
37
+ export interface InboundMessageResult {
38
+ readonly parts: readonly ContentPart[];
39
+ readonly inputTokens: number;
40
+ readonly outputTokens: number;
41
+ readonly cacheReadTokens: number;
42
+ readonly cacheWriteTokens: number;
43
+ readonly queued: boolean;
44
+ readonly sessionId: string;
45
+ readonly sessionMode: SessionMode;
46
+ readonly escalation?: EscalationSignal;
47
+ readonly contextSummary?: string;
48
+ readonly toolExecutions?: readonly ToolExecutionSummary[];
49
+ readonly traceId: string;
50
+ readonly activeAgentId?: string;
51
+ readonly routingDecision?: {
52
+ readonly provider: string;
53
+ readonly model: string;
54
+ readonly routingTier: string;
55
+ };
56
+ }
57
+ export interface BudgetDeniedResult {
58
+ readonly budgetExhausted: true;
59
+ readonly message: string;
60
+ }
61
+ export type ProcessResult = {
62
+ ok: true;
63
+ result: InboundMessageResult;
64
+ } | {
65
+ ok: false;
66
+ budgetDenied: BudgetDeniedResult;
67
+ };
68
+ export declare function processInboundMessage(ctx: InboundMessageContext): Promise<ProcessResult>;
69
+ //# sourceMappingURL=message-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-pipeline.d.ts","sourceRoot":"","sources":["../../src/gateway/message-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import { checkBudget, reportUsage } from "./budget-middleware.js";
2
+ import { TraceContext } from "./trace-context.js";
3
+ export async function processInboundMessage(ctx) {
4
+ const trace = new TraceContext(ctx.traceId);
5
+ trace.log("pipeline", "Processing inbound message", { appName: ctx.appName, userId: ctx.userId, channel: ctx.channel });
6
+ // Budget check
7
+ if (ctx.billing) {
8
+ const budgetResult = await checkBudget(ctx.billing, ctx.tenantId ?? ctx.userId);
9
+ if (!budgetResult.allowed) {
10
+ trace.log("pipeline", "Budget denied");
11
+ return {
12
+ ok: false,
13
+ budgetDenied: {
14
+ budgetExhausted: true,
15
+ message: ctx.billing.overBudgetMessage ?? "Budget exhausted.",
16
+ },
17
+ };
18
+ }
19
+ }
20
+ // Get or create session
21
+ const session = await ctx.sessionRegistry.getOrCreate({
22
+ appName: ctx.appName,
23
+ tenantId: ctx.tenantId,
24
+ userId: ctx.userId,
25
+ systemPrompt: ctx.systemPrompt,
26
+ idleTimeoutMs: ctx.idleTimeoutMs,
27
+ });
28
+ trace.log("pipeline", "Session ready", { sessionId: session.id, sessionMode: session.sessionMode });
29
+ // Merge recalled memory + knowledge context + contact context
30
+ const combinedMemory = [ctx.recalledMemory, ctx.knowledgeContext, ctx.contactContext].filter(Boolean).join("\n\n") || undefined;
31
+ // Process message
32
+ const result = await ctx.orchestrator.processMessage(session, ctx.userParts, combinedMemory, ctx.callBuiltinTools, ctx.perCallConfig);
33
+ // Persist mutated session (required for non-reference stores like Redis)
34
+ await ctx.sessionRegistry.save(session);
35
+ // Report usage (fire-and-forget)
36
+ if (ctx.billing) {
37
+ reportUsage(ctx.billing, {
38
+ tenantId: ctx.tenantId ?? ctx.userId,
39
+ messages: 1,
40
+ tokens: result.inputTokens + result.outputTokens,
41
+ model: ctx.orchestrator.model ?? "unknown",
42
+ });
43
+ }
44
+ // Emit events (fire-and-forget)
45
+ if (ctx.eventEmitter && ctx.tenantId) {
46
+ ctx.eventEmitter.emit({
47
+ eventType: "MESSAGE_RECEIVED",
48
+ tenantId: ctx.tenantId,
49
+ channel: ctx.channel,
50
+ externalUserId: ctx.userId,
51
+ sessionId: session.id,
52
+ schemaVersion: "1",
53
+ turnNumber: session.messageCount,
54
+ traceId: trace.traceId,
55
+ timestamp: new Date().toISOString(),
56
+ });
57
+ // Emit HANDOFF_MESSAGE_QUEUED when message was queued (session not ai_active)
58
+ if (result.queued) {
59
+ ctx.eventEmitter.emit({
60
+ eventType: "HANDOFF_MESSAGE_QUEUED",
61
+ tenantId: ctx.tenantId,
62
+ channel: ctx.channel,
63
+ externalUserId: ctx.userId,
64
+ sessionId: session.id,
65
+ schemaVersion: "1",
66
+ sessionMode: session.sessionMode,
67
+ traceId: trace.traceId,
68
+ timestamp: new Date().toISOString(),
69
+ });
70
+ }
71
+ // Emit ESCALATION_DETECTED when escalation signal is present
72
+ if (result.escalation) {
73
+ trace.warn("pipeline", "Escalation detected", { reason: result.escalation.reason });
74
+ ctx.eventEmitter.emit({
75
+ eventType: "ESCALATION_DETECTED",
76
+ tenantId: ctx.tenantId,
77
+ channel: ctx.channel,
78
+ externalUserId: ctx.userId,
79
+ sessionId: session.id,
80
+ schemaVersion: "1",
81
+ escalationReason: result.escalation.reason,
82
+ escalationDetail: result.escalation.detail,
83
+ summary: result.contextSummary,
84
+ sessionMode: session.sessionMode,
85
+ traceId: trace.traceId,
86
+ timestamp: new Date().toISOString(),
87
+ });
88
+ }
89
+ // Emit TOOL_EXECUTED events for product backend visibility
90
+ if (result.toolExecutions) {
91
+ for (const exec of result.toolExecutions) {
92
+ ctx.eventEmitter.emit({
93
+ eventType: "TOOL_EXECUTED",
94
+ tenantId: ctx.tenantId,
95
+ channel: ctx.channel,
96
+ externalUserId: ctx.userId,
97
+ sessionId: session.id,
98
+ schemaVersion: "1",
99
+ toolName: exec.toolName,
100
+ durationMs: exec.durationMs,
101
+ success: exec.success,
102
+ resultSummary: exec.resultSummary,
103
+ traceId: trace.traceId,
104
+ timestamp: new Date().toISOString(),
105
+ });
106
+ }
107
+ }
108
+ // Emit AGENT_ROUTED when multi-agent routing is active
109
+ if (ctx.activeAgentId) {
110
+ ctx.eventEmitter.emit({
111
+ eventType: "AGENT_ROUTED",
112
+ tenantId: ctx.tenantId,
113
+ channel: ctx.channel,
114
+ externalUserId: ctx.userId,
115
+ sessionId: session.id,
116
+ schemaVersion: "1",
117
+ activeAgentId: ctx.activeAgentId,
118
+ activeAgentName: ctx.activeAgentName,
119
+ routingTier: ctx.routingTier,
120
+ routingConfidence: ctx.routingConfidence,
121
+ traceId: trace.traceId,
122
+ timestamp: new Date().toISOString(),
123
+ });
124
+ }
125
+ // Emit AGENT_HANDOFF when an agent switch occurred (or was blocked)
126
+ if (ctx.isHandoff || ctx.pingPongBlocked) {
127
+ ctx.eventEmitter.emit({
128
+ eventType: "AGENT_HANDOFF",
129
+ tenantId: ctx.tenantId,
130
+ channel: ctx.channel,
131
+ externalUserId: ctx.userId,
132
+ sessionId: session.id,
133
+ schemaVersion: "1",
134
+ fromAgentId: ctx.previousAgentId,
135
+ fromAgentName: ctx.previousAgentName,
136
+ toAgentId: ctx.activeAgentId,
137
+ toAgentName: ctx.activeAgentName,
138
+ handoffBrief: ctx.handoffBrief,
139
+ handoffBlocked: ctx.pingPongBlocked,
140
+ handoffBlockReason: ctx.pingPongReason,
141
+ traceId: trace.traceId,
142
+ timestamp: new Date().toISOString(),
143
+ });
144
+ }
145
+ // Emit MODEL_ROUTED when model routing occurred
146
+ if (result.routingDecision) {
147
+ ctx.eventEmitter.emit({
148
+ eventType: "MODEL_ROUTED",
149
+ tenantId: ctx.tenantId,
150
+ channel: ctx.channel,
151
+ externalUserId: ctx.userId,
152
+ selectedProvider: result.routingDecision.provider,
153
+ selectedModel: result.routingDecision.model,
154
+ routingTier: result.routingDecision.routingTier,
155
+ sessionId: session.id,
156
+ schemaVersion: "1",
157
+ traceId: trace.traceId,
158
+ timestamp: new Date().toISOString(),
159
+ });
160
+ }
161
+ }
162
+ trace.log("pipeline", "Message processed", { queued: result.queued, tokens: result.inputTokens + result.outputTokens });
163
+ return {
164
+ ok: true,
165
+ result: {
166
+ parts: result.parts,
167
+ inputTokens: result.inputTokens,
168
+ outputTokens: result.outputTokens,
169
+ cacheReadTokens: result.cacheReadTokens,
170
+ cacheWriteTokens: result.cacheWriteTokens,
171
+ queued: result.queued,
172
+ sessionId: session.id,
173
+ sessionMode: session.sessionMode,
174
+ escalation: result.escalation,
175
+ contextSummary: result.contextSummary,
176
+ toolExecutions: result.toolExecutions,
177
+ traceId: trace.traceId,
178
+ activeAgentId: ctx.activeAgentId,
179
+ routingDecision: result.routingDecision
180
+ ? { provider: result.routingDecision.provider, model: result.routingDecision.model, routingTier: result.routingDecision.routingTier }
181
+ : undefined,
182
+ },
183
+ };
184
+ }
185
+ //# sourceMappingURL=message-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-pipeline.js","sourceRoot":"","sources":["../../src/gateway/message-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Hono } from "hono";
2
+ import type { ModeBOrchestrator } from "../session/mode-b-orchestrator.js";
3
+ import type { SessionRegistry } from "../session/session-registry.js";
4
+ import type { TenantRegistry } from "../tenant/tenant-registry.js";
5
+ import type { AgentHandoffSummarizer } from "../session/agent-handoff-summarizer.js";
6
+ import type { EventBus } from "@kilnai/core";
7
+ import type { BillingConfig } from "./budget-middleware.js";
8
+ import type { ConversationEventEmitter } from "./conversation-event-emitter.js";
9
+ import type { WebhookDedup } from "./webhook-dedup.js";
10
+ import type { SttAdapter, RetrievalPipeline, ContactMemoryService } from "@kilnai/core";
11
+ export interface MessengerWebhookConfig {
12
+ readonly appName: string;
13
+ readonly orchestrator: ModeBOrchestrator;
14
+ readonly sessionRegistry: SessionRegistry;
15
+ readonly tenantRegistry: TenantRegistry;
16
+ readonly verifyToken: string;
17
+ readonly appSecret?: string;
18
+ readonly billing?: BillingConfig;
19
+ readonly eventEmitter?: ConversationEventEmitter;
20
+ readonly memoryBasePath?: string;
21
+ readonly sttAdapter?: SttAdapter;
22
+ readonly knowledgePipeline?: RetrievalPipeline;
23
+ readonly knowledgeMode?: "auto" | "tool";
24
+ readonly contactMemoryService?: ContactMemoryService;
25
+ readonly dedup?: WebhookDedup;
26
+ readonly handoffSummarizer?: AgentHandoffSummarizer;
27
+ readonly eventBus?: EventBus;
28
+ }
29
+ export declare function createMessengerWebhookRoutes(config: MessengerWebhookConfig): Hono;
30
+ //# sourceMappingURL=messenger-webhook-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messenger-webhook-routes.d.ts","sourceRoot":"","sources":["../../src/gateway/messenger-webhook-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,mCAAmC,CAAC;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAIhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIxF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B;AAuFD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CA4EjF"}