@kilnai/runtime 0.1.16 → 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 (208) hide show
  1. package/README.md +2 -2
  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/enrichment/enrichment-runner.d.ts +17 -0
  35. package/dist/enrichment/enrichment-runner.d.ts.map +1 -0
  36. package/dist/enrichment/enrichment-runner.js +45 -0
  37. package/dist/enrichment/enrichment-runner.js.map +1 -0
  38. package/dist/enrichment/sqlite-enrichment-store.d.ts +14 -0
  39. package/dist/enrichment/sqlite-enrichment-store.d.ts.map +1 -0
  40. package/dist/enrichment/sqlite-enrichment-store.js +69 -0
  41. package/dist/enrichment/sqlite-enrichment-store.js.map +1 -0
  42. package/dist/gateway/audio-preprocessor.d.ts +11 -0
  43. package/dist/gateway/audio-preprocessor.d.ts.map +1 -0
  44. package/dist/gateway/audio-preprocessor.js +76 -0
  45. package/dist/gateway/audio-preprocessor.js.map +1 -0
  46. package/dist/gateway/auth-middleware.d.ts.map +1 -1
  47. package/dist/gateway/auth-middleware.js +10 -2
  48. package/dist/gateway/auth-middleware.js.map +1 -1
  49. package/dist/gateway/contact-memory-admin-routes.d.ts +9 -0
  50. package/dist/gateway/contact-memory-admin-routes.d.ts.map +1 -0
  51. package/dist/gateway/contact-memory-admin-routes.js +42 -0
  52. package/dist/gateway/contact-memory-admin-routes.js.map +1 -0
  53. package/dist/gateway/context-formatter.d.ts +5 -0
  54. package/dist/gateway/context-formatter.d.ts.map +1 -0
  55. package/dist/gateway/context-formatter.js +16 -0
  56. package/dist/gateway/context-formatter.js.map +1 -0
  57. package/dist/gateway/conversation-event-emitter.d.ts +4 -1
  58. package/dist/gateway/conversation-event-emitter.d.ts.map +1 -1
  59. package/dist/gateway/conversation-event-emitter.js +44 -13
  60. package/dist/gateway/conversation-event-emitter.js.map +1 -1
  61. package/dist/gateway/email-loop-guard.d.ts +10 -0
  62. package/dist/gateway/email-loop-guard.d.ts.map +1 -0
  63. package/dist/gateway/email-loop-guard.js +39 -0
  64. package/dist/gateway/email-loop-guard.js.map +1 -0
  65. package/dist/gateway/email-thread-store.d.ts +24 -0
  66. package/dist/gateway/email-thread-store.d.ts.map +1 -0
  67. package/dist/gateway/email-thread-store.js +34 -0
  68. package/dist/gateway/email-thread-store.js.map +1 -0
  69. package/dist/gateway/email-webhook-routes.d.ts +32 -0
  70. package/dist/gateway/email-webhook-routes.d.ts.map +1 -0
  71. package/dist/gateway/email-webhook-routes.js +411 -0
  72. package/dist/gateway/email-webhook-routes.js.map +1 -0
  73. package/dist/gateway/enrichment-admin-routes.d.ts +9 -0
  74. package/dist/gateway/enrichment-admin-routes.d.ts.map +1 -0
  75. package/dist/gateway/enrichment-admin-routes.js +41 -0
  76. package/dist/gateway/enrichment-admin-routes.js.map +1 -0
  77. package/dist/gateway/gateway-routes.d.ts +17 -1
  78. package/dist/gateway/gateway-routes.d.ts.map +1 -1
  79. package/dist/gateway/gateway-routes.js +40 -0
  80. package/dist/gateway/gateway-routes.js.map +1 -1
  81. package/dist/gateway/gateway-server.d.ts.map +1 -1
  82. package/dist/gateway/gateway-server.js +248 -12
  83. package/dist/gateway/gateway-server.js.map +1 -1
  84. package/dist/gateway/handoff-routes.d.ts.map +1 -1
  85. package/dist/gateway/handoff-routes.js +39 -0
  86. package/dist/gateway/handoff-routes.js.map +1 -1
  87. package/dist/gateway/instagram-webhook-routes.d.ts +30 -0
  88. package/dist/gateway/instagram-webhook-routes.d.ts.map +1 -0
  89. package/dist/gateway/instagram-webhook-routes.js +394 -0
  90. package/dist/gateway/instagram-webhook-routes.js.map +1 -0
  91. package/dist/gateway/knowledge-admin-routes.d.ts +9 -0
  92. package/dist/gateway/knowledge-admin-routes.d.ts.map +1 -0
  93. package/dist/gateway/knowledge-admin-routes.js +84 -0
  94. package/dist/gateway/knowledge-admin-routes.js.map +1 -0
  95. package/dist/gateway/knowledge-factory.d.ts +19 -0
  96. package/dist/gateway/knowledge-factory.d.ts.map +1 -0
  97. package/dist/gateway/knowledge-factory.js +122 -0
  98. package/dist/gateway/knowledge-factory.js.map +1 -0
  99. package/dist/gateway/message-pipeline.d.ts +21 -1
  100. package/dist/gateway/message-pipeline.d.ts.map +1 -1
  101. package/dist/gateway/message-pipeline.js +87 -1
  102. package/dist/gateway/message-pipeline.js.map +1 -1
  103. package/dist/gateway/messenger-webhook-routes.d.ts +30 -0
  104. package/dist/gateway/messenger-webhook-routes.d.ts.map +1 -0
  105. package/dist/gateway/messenger-webhook-routes.js +394 -0
  106. package/dist/gateway/messenger-webhook-routes.js.map +1 -0
  107. package/dist/gateway/meta-webhook-foundation.d.ts +12 -0
  108. package/dist/gateway/meta-webhook-foundation.d.ts.map +1 -0
  109. package/dist/gateway/meta-webhook-foundation.js +25 -0
  110. package/dist/gateway/meta-webhook-foundation.js.map +1 -0
  111. package/dist/gateway/mode-b-routes.d.ts +8 -0
  112. package/dist/gateway/mode-b-routes.d.ts.map +1 -1
  113. package/dist/gateway/mode-b-routes.js +48 -1
  114. package/dist/gateway/mode-b-routes.js.map +1 -1
  115. package/dist/gateway/outbound-routes.d.ts.map +1 -1
  116. package/dist/gateway/outbound-routes.js +49 -21
  117. package/dist/gateway/outbound-routes.js.map +1 -1
  118. package/dist/gateway/routing-test-routes.d.ts +10 -0
  119. package/dist/gateway/routing-test-routes.d.ts.map +1 -0
  120. package/dist/gateway/routing-test-routes.js +76 -0
  121. package/dist/gateway/routing-test-routes.js.map +1 -0
  122. package/dist/gateway/sqlite-email-thread-store.d.ts +13 -0
  123. package/dist/gateway/sqlite-email-thread-store.d.ts.map +1 -0
  124. package/dist/gateway/sqlite-email-thread-store.js +66 -0
  125. package/dist/gateway/sqlite-email-thread-store.js.map +1 -0
  126. package/dist/gateway/stt-factory.d.ts +3 -0
  127. package/dist/gateway/stt-factory.d.ts.map +1 -0
  128. package/dist/gateway/stt-factory.js +21 -0
  129. package/dist/gateway/stt-factory.js.map +1 -0
  130. package/dist/gateway/tenant-admin-routes.d.ts.map +1 -1
  131. package/dist/gateway/tenant-admin-routes.js +14 -0
  132. package/dist/gateway/tenant-admin-routes.js.map +1 -1
  133. package/dist/gateway/tenant-tool-factory.d.ts +10 -0
  134. package/dist/gateway/tenant-tool-factory.d.ts.map +1 -0
  135. package/dist/gateway/tenant-tool-factory.js +55 -0
  136. package/dist/gateway/tenant-tool-factory.js.map +1 -0
  137. package/dist/gateway/webhook-dedup.d.ts +13 -0
  138. package/dist/gateway/webhook-dedup.d.ts.map +1 -0
  139. package/dist/gateway/webhook-dedup.js +37 -0
  140. package/dist/gateway/webhook-dedup.js.map +1 -0
  141. package/dist/gateway/webhook-tool-executor.d.ts +17 -0
  142. package/dist/gateway/webhook-tool-executor.d.ts.map +1 -0
  143. package/dist/gateway/webhook-tool-executor.js +69 -0
  144. package/dist/gateway/webhook-tool-executor.js.map +1 -0
  145. package/dist/gateway/whatsapp-webhook-routes.d.ts +11 -0
  146. package/dist/gateway/whatsapp-webhook-routes.d.ts.map +1 -1
  147. package/dist/gateway/whatsapp-webhook-routes.js +158 -22
  148. package/dist/gateway/whatsapp-webhook-routes.js.map +1 -1
  149. package/dist/gateway/ws-tenant-routes.d.ts +9 -0
  150. package/dist/gateway/ws-tenant-routes.d.ts.map +1 -1
  151. package/dist/gateway/ws-tenant-routes.js +149 -6
  152. package/dist/gateway/ws-tenant-routes.js.map +1 -1
  153. package/dist/index.d.ts +47 -3
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +28 -1
  156. package/dist/index.js.map +1 -1
  157. package/dist/observability/composite-event-store.d.ts +13 -0
  158. package/dist/observability/composite-event-store.d.ts.map +1 -0
  159. package/dist/observability/composite-event-store.js +37 -0
  160. package/dist/observability/composite-event-store.js.map +1 -0
  161. package/dist/observability/prometheus-collector.d.ts +33 -0
  162. package/dist/observability/prometheus-collector.d.ts.map +1 -0
  163. package/dist/observability/prometheus-collector.js +170 -0
  164. package/dist/observability/prometheus-collector.js.map +1 -0
  165. package/dist/session/agent-handoff-summarizer.d.ts +11 -0
  166. package/dist/session/agent-handoff-summarizer.d.ts.map +1 -0
  167. package/dist/session/agent-handoff-summarizer.js +26 -0
  168. package/dist/session/agent-handoff-summarizer.js.map +1 -0
  169. package/dist/session/mode-b-orchestrator.d.ts +47 -1
  170. package/dist/session/mode-b-orchestrator.d.ts.map +1 -1
  171. package/dist/session/mode-b-orchestrator.js +284 -16
  172. package/dist/session/mode-b-orchestrator.js.map +1 -1
  173. package/dist/session/mode-b-session.d.ts +21 -1
  174. package/dist/session/mode-b-session.d.ts.map +1 -1
  175. package/dist/session/mode-b-session.js +40 -0
  176. package/dist/session/mode-b-session.js.map +1 -1
  177. package/dist/session/session-registry.d.ts +1 -0
  178. package/dist/session/session-registry.d.ts.map +1 -1
  179. package/dist/session/session-registry.js +33 -0
  180. package/dist/session/session-registry.js.map +1 -1
  181. package/dist/session/session-serializer.d.ts.map +1 -1
  182. package/dist/session/session-serializer.js +4 -0
  183. package/dist/session/session-serializer.js.map +1 -1
  184. package/dist/tenant/agent-resolver.d.ts +26 -0
  185. package/dist/tenant/agent-resolver.d.ts.map +1 -0
  186. package/dist/tenant/agent-resolver.js +232 -0
  187. package/dist/tenant/agent-resolver.js.map +1 -0
  188. package/dist/tenant/ping-pong-guard.d.ts +9 -0
  189. package/dist/tenant/ping-pong-guard.d.ts.map +1 -0
  190. package/dist/tenant/ping-pong-guard.js +30 -0
  191. package/dist/tenant/ping-pong-guard.js.map +1 -0
  192. package/dist/tenant/system-prompt-builder.d.ts +1 -1
  193. package/dist/tenant/system-prompt-builder.d.ts.map +1 -1
  194. package/dist/tenant/system-prompt-builder.js +13 -1
  195. package/dist/tenant/system-prompt-builder.js.map +1 -1
  196. package/dist/tenant/tenant-registry.d.ts +3 -0
  197. package/dist/tenant/tenant-registry.d.ts.map +1 -1
  198. package/dist/tenant/tenant-registry.js +83 -4
  199. package/dist/tenant/tenant-registry.js.map +1 -1
  200. package/dist/tenant/tenant-router.d.ts +27 -0
  201. package/dist/tenant/tenant-router.d.ts.map +1 -0
  202. package/dist/tenant/tenant-router.js +72 -0
  203. package/dist/tenant/tenant-router.js.map +1 -0
  204. package/dist/utils/hmac.d.ts +1 -0
  205. package/dist/utils/hmac.d.ts.map +1 -1
  206. package/dist/utils/hmac.js +3 -0
  207. package/dist/utils/hmac.js.map +1 -1
  208. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-memory-admin-routes.js","sourceRoot":"","sources":["../../src/gateway/contact-memory-admin-routes.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,4CAA4C;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQrD,MAAM,UAAU,8BAA8B,CAAC,MAAsC;IACnF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,kEAAkE;IAClE,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4CAA4C,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,GAAG,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4CAA4C,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4CAA4C,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { VectorResult, ContactFact } from "@kilnai/core";
2
+ export declare function formatKnowledgeContext(results: readonly VectorResult[]): string | undefined;
3
+ export declare function formatContactContext(facts: readonly ContactFact[]): string | undefined;
4
+ export declare function mergeContextSources(...sources: (string | undefined)[]): string | undefined;
5
+ //# sourceMappingURL=context-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-formatter.d.ts","sourceRoot":"","sources":["../../src/gateway/context-formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,GAAG,SAAS,CAG3F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,CAGtF;AAED,wBAAgB,mBAAmB,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAG1F"}
@@ -0,0 +1,16 @@
1
+ // Context formatting utilities -- shared by WS tenant, WhatsApp webhook, and Mode B routes
2
+ export function formatKnowledgeContext(results) {
3
+ if (results.length === 0)
4
+ return undefined;
5
+ return "[Knowledge context]:\n" + results.map((r) => r.content).join("\n---\n");
6
+ }
7
+ export function formatContactContext(facts) {
8
+ if (facts.length === 0)
9
+ return undefined;
10
+ return "--- Customer Context ---\n" + facts.map((f) => f.content).join("\n") + "\n---";
11
+ }
12
+ export function mergeContextSources(...sources) {
13
+ const filtered = sources.filter(Boolean);
14
+ return filtered.length > 0 ? filtered.join("\n\n") : undefined;
15
+ }
16
+ //# sourceMappingURL=context-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-formatter.js","sourceRoot":"","sources":["../../src/gateway/context-formatter.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAI3F,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,wBAAwB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA6B;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,4BAA4B,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAG,OAA+B;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC"}
@@ -2,11 +2,14 @@ import type { ConversationEvent, EventsConfig } from "@kilnai/core";
2
2
  export declare class ConversationEventEmitter {
3
3
  private readonly config;
4
4
  private readonly headers;
5
+ private readonly maxAttempts;
6
+ private readonly baseBackoffMs;
5
7
  constructor(config: EventsConfig);
6
8
  /** Emit a single conversation event. Fire-and-forget: logs errors, never throws. */
7
9
  emit(event: ConversationEvent): void;
8
10
  /** Emit multiple events in a single batch. Fire-and-forget. */
9
11
  emitBatch(events: readonly ConversationEvent[]): void;
10
- private postBatch;
12
+ private postWithRetry;
13
+ private attemptPost;
11
14
  }
12
15
  //# sourceMappingURL=conversation-event-emitter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-event-emitter.d.ts","sourceRoot":"","sources":["../../src/gateway/conversation-event-emitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAA0B,YAAY,EAAE,MAAM,cAAc,CAAC;AAiB5F,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,MAAM,EAAE,YAAY;IAKhC,oFAAoF;IACpF,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKpC,+DAA+D;IAC/D,SAAS,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;IAMrD,OAAO,CAAC,SAAS;CAalB"}
1
+ {"version":3,"file":"conversation-event-emitter.d.ts","sourceRoot":"","sources":["../../src/gateway/conversation-event-emitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAA0B,YAAY,EAAE,MAAM,cAAc,CAAC;AAqB5F,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,EAAE,YAAY;IAOhC,oFAAoF;IACpF,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKpC,+DAA+D;IAC/D,SAAS,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;IAMrD,OAAO,CAAC,aAAa;YAOP,WAAW;CA6B1B"}
@@ -14,37 +14,68 @@ function resolveHeaders(config) {
14
14
  }
15
15
  return headers;
16
16
  }
17
+ function sleep(ms) {
18
+ return new Promise((resolve) => setTimeout(resolve, ms));
19
+ }
17
20
  export class ConversationEventEmitter {
18
21
  config;
19
22
  headers;
23
+ maxAttempts;
24
+ baseBackoffMs;
20
25
  constructor(config) {
21
26
  this.config = config;
22
27
  this.headers = resolveHeaders(config);
28
+ this.maxAttempts = config.retryAttempts ?? 3;
29
+ this.baseBackoffMs = config.retryBackoffMs ?? 1000;
23
30
  }
24
31
  /** Emit a single conversation event. Fire-and-forget: logs errors, never throws. */
25
32
  emit(event) {
26
33
  const batch = { events: [event] };
27
- this.postBatch(batch);
34
+ this.postWithRetry(batch);
28
35
  }
29
36
  /** Emit multiple events in a single batch. Fire-and-forget. */
30
37
  emitBatch(events) {
31
38
  if (events.length === 0)
32
39
  return;
33
40
  const batch = { events };
34
- this.postBatch(batch);
41
+ this.postWithRetry(batch);
35
42
  }
36
- postBatch(batch) {
37
- fetch(this.config.webhook, {
38
- method: "POST",
39
- headers: this.headers,
40
- body: JSON.stringify(batch),
41
- }).then((res) => {
42
- if (!res.ok) {
43
- console.warn(`[events] POST failed: ${res.status} ${res.statusText}`);
44
- }
45
- }).catch((err) => {
46
- console.warn(`[events] POST error:`, err);
43
+ postWithRetry(batch) {
44
+ const body = JSON.stringify(batch);
45
+ this.attemptPost(body, 1).catch((err) => {
46
+ console.warn(`[events] POST error after ${this.maxAttempts} attempts:`, err);
47
47
  });
48
48
  }
49
+ async attemptPost(body, attempt) {
50
+ try {
51
+ const res = await fetch(this.config.webhook, {
52
+ method: "POST",
53
+ headers: this.headers,
54
+ body,
55
+ });
56
+ if (res.ok)
57
+ return;
58
+ // Don't retry client errors (4xx)
59
+ if (res.status < 500) {
60
+ console.warn(`[events] POST failed: ${res.status} ${res.statusText} (not retrying)`);
61
+ return;
62
+ }
63
+ // Retry server errors (5xx)
64
+ if (attempt < this.maxAttempts) {
65
+ const backoff = this.baseBackoffMs * Math.pow(2, attempt - 1);
66
+ await sleep(backoff);
67
+ return this.attemptPost(body, attempt + 1);
68
+ }
69
+ console.warn(`[events] POST failed after ${this.maxAttempts} attempts: ${res.status} ${res.statusText}`);
70
+ }
71
+ catch (err) {
72
+ if (attempt < this.maxAttempts) {
73
+ const backoff = this.baseBackoffMs * Math.pow(2, attempt - 1);
74
+ await sleep(backoff);
75
+ return this.attemptPost(body, attempt + 1);
76
+ }
77
+ throw err;
78
+ }
79
+ }
49
80
  }
50
81
  //# sourceMappingURL=conversation-event-emitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-event-emitter.js","sourceRoot":"","sources":["../../src/gateway/conversation-event-emitter.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,wDAAwD;AAIxD,mEAAmE;AACnE,SAAS,cAAc,CAAC,MAAoB;IAC1C,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;oBAClC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;oBACxC,CAAC,CAAC,KAAK,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,wBAAwB;IAClB,MAAM,CAAe;IACrB,OAAO,CAAyB;IAEjD,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,oFAAoF;IACpF,IAAI,CAAC,KAAwB;QAC3B,MAAM,KAAK,GAA2B,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,+DAA+D;IAC/D,SAAS,CAAC,MAAoC;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAA2B,EAAE,MAAM,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEO,SAAS,CAAC,KAA6B;QAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"conversation-event-emitter.js","sourceRoot":"","sources":["../../src/gateway/conversation-event-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Check if inbound email headers indicate an auto-reply (RFC 3834) */
2
+ export declare function isAutoReply(headers: Record<string, string>): boolean;
3
+ /** Check if the sender address should be ignored (system addresses) */
4
+ export declare function isIgnoredSender(from: string): boolean;
5
+ /** Combined rejection check -- returns reason string for logging */
6
+ export declare function shouldRejectEmail(from: string, headers: Record<string, string>): {
7
+ reject: boolean;
8
+ reason?: string;
9
+ };
10
+ //# sourceMappingURL=email-loop-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-loop-guard.d.ts","sourceRoot":"","sources":["../../src/gateway/email-loop-guard.ts"],"names":[],"mappings":"AAMA,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAapE;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKrD;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQtC"}
@@ -0,0 +1,39 @@
1
+ // Email auto-reply loop prevention -- pure functions
2
+ // Prevents infinite loops when AI replies trigger vacation responders, bounces, or mailing lists
3
+ const AUTOMATED_PRECEDENCE = new Set(["bulk", "junk", "list"]);
4
+ const IGNORED_PREFIXES = ["noreply@", "no-reply@", "mailer-daemon@", "postmaster@", "bounce@", "auto@"];
5
+ /** Check if inbound email headers indicate an auto-reply (RFC 3834) */
6
+ export function isAutoReply(headers) {
7
+ const autoSubmitted = headers["auto-submitted"] ?? headers["Auto-Submitted"];
8
+ if (autoSubmitted && autoSubmitted.toLowerCase() !== "no")
9
+ return true;
10
+ const precedence = (headers["precedence"] ?? headers["Precedence"] ?? "").toLowerCase();
11
+ if (AUTOMATED_PRECEDENCE.has(precedence))
12
+ return true;
13
+ if (headers["x-auto-response-suppress"] ?? headers["X-Auto-Response-Suppress"])
14
+ return true;
15
+ const returnPath = headers["return-path"] ?? headers["Return-Path"];
16
+ if (returnPath === "<>" || returnPath === "")
17
+ return true;
18
+ return false;
19
+ }
20
+ /** Check if the sender address should be ignored (system addresses) */
21
+ export function isIgnoredSender(from) {
22
+ if (!from)
23
+ return true;
24
+ const lower = from.toLowerCase().trim();
25
+ if (!lower)
26
+ return true;
27
+ return IGNORED_PREFIXES.some((prefix) => lower.startsWith(prefix));
28
+ }
29
+ /** Combined rejection check -- returns reason string for logging */
30
+ export function shouldRejectEmail(from, headers) {
31
+ if (isIgnoredSender(from)) {
32
+ return { reject: true, reason: `ignored sender: ${from}` };
33
+ }
34
+ if (isAutoReply(headers)) {
35
+ return { reject: true, reason: "auto-reply detected via headers" };
36
+ }
37
+ return { reject: false };
38
+ }
39
+ //# sourceMappingURL=email-loop-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-loop-guard.js","sourceRoot":"","sources":["../../src/gateway/email-loop-guard.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,iGAAiG;AAEjG,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExG,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,OAA+B;IACzD,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7E,IAAI,aAAa,IAAI,aAAa,CAAC,WAAW,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvE,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxF,IAAI,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtD,IAAI,OAAO,CAAC,0BAA0B,CAAC,IAAI,OAAO,CAAC,0BAA0B,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5F,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IACpE,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAE1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,OAA+B;IAE/B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface EmailThread {
2
+ readonly threadId: string;
3
+ readonly tenantId: string;
4
+ readonly senderEmail: string;
5
+ readonly subject: string;
6
+ readonly messageIds: string[];
7
+ readonly createdAt: Date;
8
+ readonly lastActivityAt: Date;
9
+ }
10
+ export interface EmailThreadStore {
11
+ getByMessageId(messageId: string): EmailThread | undefined;
12
+ getByReference(references: string[]): EmailThread | undefined;
13
+ save(thread: EmailThread): void;
14
+ delete(threadId: string): void;
15
+ }
16
+ export declare class InMemoryEmailThreadStore implements EmailThreadStore {
17
+ private readonly messageIdIndex;
18
+ private readonly threads;
19
+ getByMessageId(messageId: string): EmailThread | undefined;
20
+ getByReference(references: string[]): EmailThread | undefined;
21
+ save(thread: EmailThread): void;
22
+ delete(threadId: string): void;
23
+ }
24
+ //# sourceMappingURL=email-thread-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-thread-store.d.ts","sourceRoot":"","sources":["../../src/gateway/email-thread-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3D,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,SAAS,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAK1D,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,SAAS;IAQ7D,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAO/B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAQ/B"}
@@ -0,0 +1,34 @@
1
+ // Email thread tracking via Message-ID chain
2
+ // Maps Message-ID headers to thread state for conversational continuity
3
+ export class InMemoryEmailThreadStore {
4
+ messageIdIndex = new Map();
5
+ threads = new Map();
6
+ getByMessageId(messageId) {
7
+ const threadId = this.messageIdIndex.get(messageId);
8
+ return threadId ? this.threads.get(threadId) : undefined;
9
+ }
10
+ getByReference(references) {
11
+ for (const ref of references) {
12
+ const threadId = this.messageIdIndex.get(ref);
13
+ if (threadId)
14
+ return this.threads.get(threadId);
15
+ }
16
+ return undefined;
17
+ }
18
+ save(thread) {
19
+ this.threads.set(thread.threadId, thread);
20
+ for (const mid of thread.messageIds) {
21
+ this.messageIdIndex.set(mid, thread.threadId);
22
+ }
23
+ }
24
+ delete(threadId) {
25
+ const thread = this.threads.get(threadId);
26
+ if (!thread)
27
+ return;
28
+ for (const mid of thread.messageIds) {
29
+ this.messageIdIndex.delete(mid);
30
+ }
31
+ this.threads.delete(threadId);
32
+ }
33
+ }
34
+ //# sourceMappingURL=email-thread-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-thread-store.js","sourceRoot":"","sources":["../../src/gateway/email-thread-store.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,wEAAwE;AAmBxE,MAAM,OAAO,wBAAwB;IAClB,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1D,cAAc,CAAC,SAAiB;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IAED,cAAc,CAAC,UAAoB;QACjC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,MAAmB;QACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAgB;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,32 @@
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 { RetrievalPipeline, ContactMemoryService } from "@kilnai/core";
10
+ import type { EmailThreadStore } from "./email-thread-store.js";
11
+ import type { EmailTransport } from "../channels/email-api.js";
12
+ export interface EmailWebhookConfig {
13
+ readonly appName: string;
14
+ readonly orchestrator: ModeBOrchestrator;
15
+ readonly sessionRegistry: SessionRegistry;
16
+ readonly tenantRegistry: TenantRegistry;
17
+ readonly webhookSecret?: string;
18
+ readonly billing?: BillingConfig;
19
+ readonly eventEmitter?: ConversationEventEmitter;
20
+ readonly memoryBasePath?: string;
21
+ readonly knowledgePipeline?: RetrievalPipeline;
22
+ readonly knowledgeMode?: "auto" | "tool";
23
+ readonly contactMemoryService?: ContactMemoryService;
24
+ readonly threadStore?: EmailThreadStore;
25
+ readonly emailTransport?: EmailTransport;
26
+ readonly defaultFromAddress?: string;
27
+ readonly defaultFromName?: string;
28
+ readonly handoffSummarizer?: AgentHandoffSummarizer;
29
+ readonly eventBus?: EventBus;
30
+ }
31
+ export declare function createEmailWebhookRoutes(config: EmailWebhookConfig): Hono;
32
+ //# sourceMappingURL=email-webhook-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-webhook-routes.d.ts","sourceRoot":"","sources":["../../src/gateway/email-webhook-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,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;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAG5E,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,yBAAyB,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,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,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,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,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,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B;AAyDD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAiEzE"}