nduka 1.0.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 (1011) hide show
  1. package/README.md +157 -0
  2. package/config/agent-tools.settings.json +70 -0
  3. package/config/chatbot.config.json +113 -0
  4. package/config/chatbot.config.schema.json +54 -0
  5. package/config/connectors.chatbot.json +5 -0
  6. package/config/llm.settings.json +416 -0
  7. package/config/prompts.chatbot.json +13 -0
  8. package/config/secure-tool-identities.example.json +21 -0
  9. package/config/secure-tool-identities.json +13 -0
  10. package/config/secure-tools.chatbot.json +82 -0
  11. package/config/secure-tools.example.json +200 -0
  12. package/config/test.env +2 -0
  13. package/config/tools.chatbot.json +318 -0
  14. package/dist/acceptance/index.d.ts +3 -0
  15. package/dist/acceptance/index.d.ts.map +1 -0
  16. package/dist/acceptance/index.js +2 -0
  17. package/dist/acceptance/index.js.map +1 -0
  18. package/dist/acceptance/runner.d.ts +57 -0
  19. package/dist/acceptance/runner.d.ts.map +1 -0
  20. package/dist/acceptance/runner.js +222 -0
  21. package/dist/acceptance/runner.js.map +1 -0
  22. package/dist/agent-runtime/engine.d.ts +73 -0
  23. package/dist/agent-runtime/engine.d.ts.map +1 -0
  24. package/dist/agent-runtime/engine.js +169 -0
  25. package/dist/agent-runtime/engine.js.map +1 -0
  26. package/dist/agent-runtime/index.d.ts +3 -0
  27. package/dist/agent-runtime/index.d.ts.map +1 -0
  28. package/dist/agent-runtime/index.js +2 -0
  29. package/dist/agent-runtime/index.js.map +1 -0
  30. package/dist/agent-tools/agent-tool-router.d.ts +44 -0
  31. package/dist/agent-tools/agent-tool-router.d.ts.map +1 -0
  32. package/dist/agent-tools/agent-tool-router.js +196 -0
  33. package/dist/agent-tools/agent-tool-router.js.map +1 -0
  34. package/dist/agent-tools/async-tool-bridge.d.ts +31 -0
  35. package/dist/agent-tools/async-tool-bridge.d.ts.map +1 -0
  36. package/dist/agent-tools/async-tool-bridge.js +65 -0
  37. package/dist/agent-tools/async-tool-bridge.js.map +1 -0
  38. package/dist/agent-tools/async-tool-processor.d.ts +19 -0
  39. package/dist/agent-tools/async-tool-processor.d.ts.map +1 -0
  40. package/dist/agent-tools/async-tool-processor.js +81 -0
  41. package/dist/agent-tools/async-tool-processor.js.map +1 -0
  42. package/dist/agent-tools/claude-tool-adapter.d.ts +20 -0
  43. package/dist/agent-tools/claude-tool-adapter.d.ts.map +1 -0
  44. package/dist/agent-tools/claude-tool-adapter.js +64 -0
  45. package/dist/agent-tools/claude-tool-adapter.js.map +1 -0
  46. package/dist/agent-tools/claude-tool-planner.d.ts +35 -0
  47. package/dist/agent-tools/claude-tool-planner.d.ts.map +1 -0
  48. package/dist/agent-tools/claude-tool-planner.js +83 -0
  49. package/dist/agent-tools/claude-tool-planner.js.map +1 -0
  50. package/dist/agent-tools/connector-tool-adapter.d.ts +16 -0
  51. package/dist/agent-tools/connector-tool-adapter.d.ts.map +1 -0
  52. package/dist/agent-tools/connector-tool-adapter.js +62 -0
  53. package/dist/agent-tools/connector-tool-adapter.js.map +1 -0
  54. package/dist/agent-tools/context-routing-policy.d.ts +4 -0
  55. package/dist/agent-tools/context-routing-policy.d.ts.map +1 -0
  56. package/dist/agent-tools/context-routing-policy.js +20 -0
  57. package/dist/agent-tools/context-routing-policy.js.map +1 -0
  58. package/dist/agent-tools/index.d.ts +18 -0
  59. package/dist/agent-tools/index.d.ts.map +1 -0
  60. package/dist/agent-tools/index.js +18 -0
  61. package/dist/agent-tools/index.js.map +1 -0
  62. package/dist/agent-tools/logging.d.ts +3 -0
  63. package/dist/agent-tools/logging.d.ts.map +1 -0
  64. package/dist/agent-tools/logging.js +15 -0
  65. package/dist/agent-tools/logging.js.map +1 -0
  66. package/dist/agent-tools/mcp-tool-adapter.d.ts +18 -0
  67. package/dist/agent-tools/mcp-tool-adapter.d.ts.map +1 -0
  68. package/dist/agent-tools/mcp-tool-adapter.js +76 -0
  69. package/dist/agent-tools/mcp-tool-adapter.js.map +1 -0
  70. package/dist/agent-tools/settings.d.ts +50 -0
  71. package/dist/agent-tools/settings.d.ts.map +1 -0
  72. package/dist/agent-tools/settings.js +101 -0
  73. package/dist/agent-tools/settings.js.map +1 -0
  74. package/dist/agent-tools/tool-candidate-detector.d.ts +16 -0
  75. package/dist/agent-tools/tool-candidate-detector.d.ts.map +1 -0
  76. package/dist/agent-tools/tool-candidate-detector.js +165 -0
  77. package/dist/agent-tools/tool-candidate-detector.js.map +1 -0
  78. package/dist/agent-tools/tool-chain-runner.d.ts +24 -0
  79. package/dist/agent-tools/tool-chain-runner.d.ts.map +1 -0
  80. package/dist/agent-tools/tool-chain-runner.js +39 -0
  81. package/dist/agent-tools/tool-chain-runner.js.map +1 -0
  82. package/dist/agent-tools/tool-context-store.d.ts +28 -0
  83. package/dist/agent-tools/tool-context-store.d.ts.map +1 -0
  84. package/dist/agent-tools/tool-context-store.js +127 -0
  85. package/dist/agent-tools/tool-context-store.js.map +1 -0
  86. package/dist/agent-tools/tool-followup-resolver.d.ts +18 -0
  87. package/dist/agent-tools/tool-followup-resolver.d.ts.map +1 -0
  88. package/dist/agent-tools/tool-followup-resolver.js +98 -0
  89. package/dist/agent-tools/tool-followup-resolver.js.map +1 -0
  90. package/dist/agent-tools/tool-plan-validator.d.ts +13 -0
  91. package/dist/agent-tools/tool-plan-validator.d.ts.map +1 -0
  92. package/dist/agent-tools/tool-plan-validator.js +119 -0
  93. package/dist/agent-tools/tool-plan-validator.js.map +1 -0
  94. package/dist/agent-tools/tool-result-summarizer.d.ts +17 -0
  95. package/dist/agent-tools/tool-result-summarizer.d.ts.map +1 -0
  96. package/dist/agent-tools/tool-result-summarizer.js +41 -0
  97. package/dist/agent-tools/tool-result-summarizer.js.map +1 -0
  98. package/dist/agent-tools/tool-session-store.d.ts +49 -0
  99. package/dist/agent-tools/tool-session-store.d.ts.map +1 -0
  100. package/dist/agent-tools/tool-session-store.js +104 -0
  101. package/dist/agent-tools/tool-session-store.js.map +1 -0
  102. package/dist/agent-tools/types.d.ts +97 -0
  103. package/dist/agent-tools/types.d.ts.map +1 -0
  104. package/dist/agent-tools/types.js +2 -0
  105. package/dist/agent-tools/types.js.map +1 -0
  106. package/dist/ai/execution-controller.d.ts +62 -0
  107. package/dist/ai/execution-controller.d.ts.map +1 -0
  108. package/dist/ai/execution-controller.js +117 -0
  109. package/dist/ai/execution-controller.js.map +1 -0
  110. package/dist/ai/index.d.ts +3 -0
  111. package/dist/ai/index.d.ts.map +1 -0
  112. package/dist/ai/index.js +2 -0
  113. package/dist/ai/index.js.map +1 -0
  114. package/dist/ai-context/engine.d.ts +85 -0
  115. package/dist/ai-context/engine.d.ts.map +1 -0
  116. package/dist/ai-context/engine.js +173 -0
  117. package/dist/ai-context/engine.js.map +1 -0
  118. package/dist/ai-context/index.d.ts +3 -0
  119. package/dist/ai-context/index.d.ts.map +1 -0
  120. package/dist/ai-context/index.js +2 -0
  121. package/dist/ai-context/index.js.map +1 -0
  122. package/dist/ai-router/index.d.ts +3 -0
  123. package/dist/ai-router/index.d.ts.map +1 -0
  124. package/dist/ai-router/index.js +2 -0
  125. package/dist/ai-router/index.js.map +1 -0
  126. package/dist/ai-router/router.d.ts +68 -0
  127. package/dist/ai-router/router.d.ts.map +1 -0
  128. package/dist/ai-router/router.js +260 -0
  129. package/dist/ai-router/router.js.map +1 -0
  130. package/dist/async-jobs/context-resolver-planner.d.ts +35 -0
  131. package/dist/async-jobs/context-resolver-planner.d.ts.map +1 -0
  132. package/dist/async-jobs/context-resolver-planner.js +324 -0
  133. package/dist/async-jobs/context-resolver-planner.js.map +1 -0
  134. package/dist/async-jobs/gateway-worker.d.ts +22 -0
  135. package/dist/async-jobs/gateway-worker.d.ts.map +1 -0
  136. package/dist/async-jobs/gateway-worker.js +53 -0
  137. package/dist/async-jobs/gateway-worker.js.map +1 -0
  138. package/dist/async-jobs/job-delivery.d.ts +16 -0
  139. package/dist/async-jobs/job-delivery.d.ts.map +1 -0
  140. package/dist/async-jobs/job-delivery.js +30 -0
  141. package/dist/async-jobs/job-delivery.js.map +1 -0
  142. package/dist/async-jobs/job-runner.d.ts +39 -0
  143. package/dist/async-jobs/job-runner.d.ts.map +1 -0
  144. package/dist/async-jobs/job-runner.js +67 -0
  145. package/dist/async-jobs/job-runner.js.map +1 -0
  146. package/dist/async-jobs/job-store.d.ts +27 -0
  147. package/dist/async-jobs/job-store.d.ts.map +1 -0
  148. package/dist/async-jobs/job-store.js +168 -0
  149. package/dist/async-jobs/job-store.js.map +1 -0
  150. package/dist/async-jobs/job-types.d.ts +59 -0
  151. package/dist/async-jobs/job-types.d.ts.map +1 -0
  152. package/dist/async-jobs/job-types.js +2 -0
  153. package/dist/async-jobs/job-types.js.map +1 -0
  154. package/dist/async-jobs/job-utils.d.ts +16 -0
  155. package/dist/async-jobs/job-utils.d.ts.map +1 -0
  156. package/dist/async-jobs/job-utils.js +72 -0
  157. package/dist/async-jobs/job-utils.js.map +1 -0
  158. package/dist/async-jobs/job-worker.d.ts +31 -0
  159. package/dist/async-jobs/job-worker.d.ts.map +1 -0
  160. package/dist/async-jobs/job-worker.js +60 -0
  161. package/dist/async-jobs/job-worker.js.map +1 -0
  162. package/dist/async-jobs/message-triage-planner.d.ts +52 -0
  163. package/dist/async-jobs/message-triage-planner.d.ts.map +1 -0
  164. package/dist/async-jobs/message-triage-planner.js +262 -0
  165. package/dist/async-jobs/message-triage-planner.js.map +1 -0
  166. package/dist/async-jobs/request-controller.d.ts +65 -0
  167. package/dist/async-jobs/request-controller.d.ts.map +1 -0
  168. package/dist/async-jobs/request-controller.js +471 -0
  169. package/dist/async-jobs/request-controller.js.map +1 -0
  170. package/dist/async-jobs/routing-context.d.ts +12 -0
  171. package/dist/async-jobs/routing-context.d.ts.map +1 -0
  172. package/dist/async-jobs/routing-context.js +15 -0
  173. package/dist/async-jobs/routing-context.js.map +1 -0
  174. package/dist/async-jobs/tool-intent-planner.d.ts +51 -0
  175. package/dist/async-jobs/tool-intent-planner.d.ts.map +1 -0
  176. package/dist/async-jobs/tool-intent-planner.js +241 -0
  177. package/dist/async-jobs/tool-intent-planner.js.map +1 -0
  178. package/dist/async-jobs/tool-processor.d.ts +31 -0
  179. package/dist/async-jobs/tool-processor.d.ts.map +1 -0
  180. package/dist/async-jobs/tool-processor.js +263 -0
  181. package/dist/async-jobs/tool-processor.js.map +1 -0
  182. package/dist/auth/session-admin.d.ts +19 -0
  183. package/dist/auth/session-admin.d.ts.map +1 -0
  184. package/dist/auth/session-admin.js +52 -0
  185. package/dist/auth/session-admin.js.map +1 -0
  186. package/dist/chat-registry/aliases.d.ts +55 -0
  187. package/dist/chat-registry/aliases.d.ts.map +1 -0
  188. package/dist/chat-registry/aliases.js +170 -0
  189. package/dist/chat-registry/aliases.js.map +1 -0
  190. package/dist/chat-registry/index.d.ts +3 -0
  191. package/dist/chat-registry/index.d.ts.map +1 -0
  192. package/dist/chat-registry/index.js +2 -0
  193. package/dist/chat-registry/index.js.map +1 -0
  194. package/dist/chat-registry/service.d.ts +54 -0
  195. package/dist/chat-registry/service.d.ts.map +1 -0
  196. package/dist/chat-registry/service.js +224 -0
  197. package/dist/chat-registry/service.js.map +1 -0
  198. package/dist/chat-state/execution-gate.d.ts +66 -0
  199. package/dist/chat-state/execution-gate.d.ts.map +1 -0
  200. package/dist/chat-state/execution-gate.js +143 -0
  201. package/dist/chat-state/execution-gate.js.map +1 -0
  202. package/dist/chat-state/index.d.ts +7 -0
  203. package/dist/chat-state/index.d.ts.map +1 -0
  204. package/dist/chat-state/index.js +4 -0
  205. package/dist/chat-state/index.js.map +1 -0
  206. package/dist/chat-state/invariants.d.ts +32 -0
  207. package/dist/chat-state/invariants.d.ts.map +1 -0
  208. package/dist/chat-state/invariants.js +95 -0
  209. package/dist/chat-state/invariants.js.map +1 -0
  210. package/dist/chat-state/store.d.ts +55 -0
  211. package/dist/chat-state/store.d.ts.map +1 -0
  212. package/dist/chat-state/store.js +220 -0
  213. package/dist/chat-state/store.js.map +1 -0
  214. package/dist/cli/admin-inspection.d.ts +17 -0
  215. package/dist/cli/admin-inspection.d.ts.map +1 -0
  216. package/dist/cli/admin-inspection.js +161 -0
  217. package/dist/cli/admin-inspection.js.map +1 -0
  218. package/dist/cli/connector-admin.d.ts +2 -0
  219. package/dist/cli/connector-admin.d.ts.map +1 -0
  220. package/dist/cli/connector-admin.js +28 -0
  221. package/dist/cli/connector-admin.js.map +1 -0
  222. package/dist/cli/index.d.ts +7 -0
  223. package/dist/cli/index.d.ts.map +1 -0
  224. package/dist/cli/index.js +709 -0
  225. package/dist/cli/index.js.map +1 -0
  226. package/dist/config/chatbot-config.d.ts +108 -0
  227. package/dist/config/chatbot-config.d.ts.map +1 -0
  228. package/dist/config/chatbot-config.js +280 -0
  229. package/dist/config/chatbot-config.js.map +1 -0
  230. package/dist/config/config-editor.d.ts +16 -0
  231. package/dist/config/config-editor.d.ts.map +1 -0
  232. package/dist/config/config-editor.js +367 -0
  233. package/dist/config/config-editor.js.map +1 -0
  234. package/dist/config/local-env-editor.d.ts +22 -0
  235. package/dist/config/local-env-editor.d.ts.map +1 -0
  236. package/dist/config/local-env-editor.js +129 -0
  237. package/dist/config/local-env-editor.js.map +1 -0
  238. package/dist/config/runtime-feature-flags.d.ts +19 -0
  239. package/dist/config/runtime-feature-flags.d.ts.map +1 -0
  240. package/dist/config/runtime-feature-flags.js +39 -0
  241. package/dist/config/runtime-feature-flags.js.map +1 -0
  242. package/dist/connectors/audit.d.ts +32 -0
  243. package/dist/connectors/audit.d.ts.map +1 -0
  244. package/dist/connectors/audit.js +77 -0
  245. package/dist/connectors/audit.js.map +1 -0
  246. package/dist/connectors/config.d.ts +9 -0
  247. package/dist/connectors/config.d.ts.map +1 -0
  248. package/dist/connectors/config.js +66 -0
  249. package/dist/connectors/config.js.map +1 -0
  250. package/dist/connectors/dns-guard.d.ts +7 -0
  251. package/dist/connectors/dns-guard.d.ts.map +1 -0
  252. package/dist/connectors/dns-guard.js +70 -0
  253. package/dist/connectors/dns-guard.js.map +1 -0
  254. package/dist/connectors/executor.d.ts +30 -0
  255. package/dist/connectors/executor.d.ts.map +1 -0
  256. package/dist/connectors/executor.js +80 -0
  257. package/dist/connectors/executor.js.map +1 -0
  258. package/dist/connectors/manifest.d.ts +18 -0
  259. package/dist/connectors/manifest.d.ts.map +1 -0
  260. package/dist/connectors/manifest.js +72 -0
  261. package/dist/connectors/manifest.js.map +1 -0
  262. package/dist/connectors/runner.d.ts +17 -0
  263. package/dist/connectors/runner.d.ts.map +1 -0
  264. package/dist/connectors/runner.js +36 -0
  265. package/dist/connectors/runner.js.map +1 -0
  266. package/dist/connectors/url-guard.d.ts +7 -0
  267. package/dist/connectors/url-guard.d.ts.map +1 -0
  268. package/dist/connectors/url-guard.js +50 -0
  269. package/dist/connectors/url-guard.js.map +1 -0
  270. package/dist/conversation/connector-command-controller.d.ts +31 -0
  271. package/dist/conversation/connector-command-controller.d.ts.map +1 -0
  272. package/dist/conversation/connector-command-controller.js +105 -0
  273. package/dist/conversation/connector-command-controller.js.map +1 -0
  274. package/dist/conversation/context-command-controller.d.ts +23 -0
  275. package/dist/conversation/context-command-controller.d.ts.map +1 -0
  276. package/dist/conversation/context-command-controller.js +184 -0
  277. package/dist/conversation/context-command-controller.js.map +1 -0
  278. package/dist/conversation/group-reply-policy.d.ts +3 -0
  279. package/dist/conversation/group-reply-policy.d.ts.map +1 -0
  280. package/dist/conversation/group-reply-policy.js +17 -0
  281. package/dist/conversation/group-reply-policy.js.map +1 -0
  282. package/dist/conversation/index.d.ts +3 -0
  283. package/dist/conversation/index.d.ts.map +1 -0
  284. package/dist/conversation/index.js +2 -0
  285. package/dist/conversation/index.js.map +1 -0
  286. package/dist/conversation/lock-manager.d.ts +47 -0
  287. package/dist/conversation/lock-manager.d.ts.map +1 -0
  288. package/dist/conversation/lock-manager.js +144 -0
  289. package/dist/conversation/lock-manager.js.map +1 -0
  290. package/dist/conversation/memory-trace.d.ts +16 -0
  291. package/dist/conversation/memory-trace.d.ts.map +1 -0
  292. package/dist/conversation/memory-trace.js +13 -0
  293. package/dist/conversation/memory-trace.js.map +1 -0
  294. package/dist/conversation/natural-schedule-command-controller.d.ts +21 -0
  295. package/dist/conversation/natural-schedule-command-controller.d.ts.map +1 -0
  296. package/dist/conversation/natural-schedule-command-controller.js +180 -0
  297. package/dist/conversation/natural-schedule-command-controller.js.map +1 -0
  298. package/dist/conversation/ops.d.ts +75 -0
  299. package/dist/conversation/ops.d.ts.map +1 -0
  300. package/dist/conversation/ops.js +169 -0
  301. package/dist/conversation/ops.js.map +1 -0
  302. package/dist/conversation/owner-action-command-controller.d.ts +25 -0
  303. package/dist/conversation/owner-action-command-controller.d.ts.map +1 -0
  304. package/dist/conversation/owner-action-command-controller.js +90 -0
  305. package/dist/conversation/owner-action-command-controller.js.map +1 -0
  306. package/dist/conversation/owner-action-planner.d.ts +28 -0
  307. package/dist/conversation/owner-action-planner.d.ts.map +1 -0
  308. package/dist/conversation/owner-action-planner.js +99 -0
  309. package/dist/conversation/owner-action-planner.js.map +1 -0
  310. package/dist/conversation/rate-limiter.d.ts +22 -0
  311. package/dist/conversation/rate-limiter.d.ts.map +1 -0
  312. package/dist/conversation/rate-limiter.js +66 -0
  313. package/dist/conversation/rate-limiter.js.map +1 -0
  314. package/dist/conversation/runtime-admin-media.d.ts +11 -0
  315. package/dist/conversation/runtime-admin-media.d.ts.map +1 -0
  316. package/dist/conversation/runtime-admin-media.js +31 -0
  317. package/dist/conversation/runtime-admin-media.js.map +1 -0
  318. package/dist/conversation/runtime-group.d.ts +13 -0
  319. package/dist/conversation/runtime-group.d.ts.map +1 -0
  320. package/dist/conversation/runtime-group.js +96 -0
  321. package/dist/conversation/runtime-group.js.map +1 -0
  322. package/dist/conversation/runtime-impl.d.ts +90 -0
  323. package/dist/conversation/runtime-impl.d.ts.map +1 -0
  324. package/dist/conversation/runtime-impl.js +452 -0
  325. package/dist/conversation/runtime-impl.js.map +1 -0
  326. package/dist/conversation/runtime-kb.d.ts +36 -0
  327. package/dist/conversation/runtime-kb.d.ts.map +1 -0
  328. package/dist/conversation/runtime-kb.js +123 -0
  329. package/dist/conversation/runtime-kb.js.map +1 -0
  330. package/dist/conversation/runtime-media.d.ts +28 -0
  331. package/dist/conversation/runtime-media.d.ts.map +1 -0
  332. package/dist/conversation/runtime-media.js +93 -0
  333. package/dist/conversation/runtime-media.js.map +1 -0
  334. package/dist/conversation/runtime-production.d.ts +36 -0
  335. package/dist/conversation/runtime-production.d.ts.map +1 -0
  336. package/dist/conversation/runtime-production.js +274 -0
  337. package/dist/conversation/runtime-production.js.map +1 -0
  338. package/dist/conversation/runtime-timing.d.ts +2 -0
  339. package/dist/conversation/runtime-timing.d.ts.map +1 -0
  340. package/dist/conversation/runtime-timing.js +2 -0
  341. package/dist/conversation/runtime-timing.js.map +1 -0
  342. package/dist/conversation/runtime.d.ts +3 -0
  343. package/dist/conversation/runtime.d.ts.map +1 -0
  344. package/dist/conversation/runtime.js +2 -0
  345. package/dist/conversation/runtime.js.map +1 -0
  346. package/dist/conversation/secure-tool-natural-language-controller.d.ts +67 -0
  347. package/dist/conversation/secure-tool-natural-language-controller.d.ts.map +1 -0
  348. package/dist/conversation/secure-tool-natural-language-controller.js +634 -0
  349. package/dist/conversation/secure-tool-natural-language-controller.js.map +1 -0
  350. package/dist/conversation/secure-tool-routing.d.ts +5 -0
  351. package/dist/conversation/secure-tool-routing.d.ts.map +1 -0
  352. package/dist/conversation/secure-tool-routing.js +91 -0
  353. package/dist/conversation/secure-tool-routing.js.map +1 -0
  354. package/dist/conversation/secure-tool-runtime-utils.d.ts +4 -0
  355. package/dist/conversation/secure-tool-runtime-utils.d.ts.map +1 -0
  356. package/dist/conversation/secure-tool-runtime-utils.js +19 -0
  357. package/dist/conversation/secure-tool-runtime-utils.js.map +1 -0
  358. package/dist/conversation/slash-command.d.ts +8 -0
  359. package/dist/conversation/slash-command.d.ts.map +1 -0
  360. package/dist/conversation/slash-command.js +13 -0
  361. package/dist/conversation/slash-command.js.map +1 -0
  362. package/dist/conversation/target-resolver.d.ts +7 -0
  363. package/dist/conversation/target-resolver.d.ts.map +1 -0
  364. package/dist/conversation/target-resolver.js +23 -0
  365. package/dist/conversation/target-resolver.js.map +1 -0
  366. package/dist/copilot/engine.d.ts +102 -0
  367. package/dist/copilot/engine.d.ts.map +1 -0
  368. package/dist/copilot/engine.js +222 -0
  369. package/dist/copilot/engine.js.map +1 -0
  370. package/dist/copilot/index.d.ts +3 -0
  371. package/dist/copilot/index.d.ts.map +1 -0
  372. package/dist/copilot/index.js +2 -0
  373. package/dist/copilot/index.js.map +1 -0
  374. package/dist/database/index.d.ts +135 -0
  375. package/dist/database/index.d.ts.map +1 -0
  376. package/dist/database/index.js +331 -0
  377. package/dist/database/index.js.map +1 -0
  378. package/dist/database/path.d.ts +2 -0
  379. package/dist/database/path.d.ts.map +1 -0
  380. package/dist/database/path.js +5 -0
  381. package/dist/database/path.js.map +1 -0
  382. package/dist/event-bus/index.d.ts +153 -0
  383. package/dist/event-bus/index.d.ts.map +1 -0
  384. package/dist/event-bus/index.js +118 -0
  385. package/dist/event-bus/index.js.map +1 -0
  386. package/dist/event-sourcing/index.d.ts +3 -0
  387. package/dist/event-sourcing/index.d.ts.map +1 -0
  388. package/dist/event-sourcing/index.js +2 -0
  389. package/dist/event-sourcing/index.js.map +1 -0
  390. package/dist/event-sourcing/store.d.ts +54 -0
  391. package/dist/event-sourcing/store.d.ts.map +1 -0
  392. package/dist/event-sourcing/store.js +169 -0
  393. package/dist/event-sourcing/store.js.map +1 -0
  394. package/dist/gateway/auth/index.d.ts +5 -0
  395. package/dist/gateway/auth/index.d.ts.map +1 -0
  396. package/dist/gateway/auth/index.js +5 -0
  397. package/dist/gateway/auth/index.js.map +1 -0
  398. package/dist/gateway/auth/store.d.ts +44 -0
  399. package/dist/gateway/auth/store.d.ts.map +1 -0
  400. package/dist/gateway/auth/store.js +387 -0
  401. package/dist/gateway/auth/store.js.map +1 -0
  402. package/dist/gateway/bootstrap.d.ts +2 -0
  403. package/dist/gateway/bootstrap.d.ts.map +1 -0
  404. package/dist/gateway/bootstrap.js +8 -0
  405. package/dist/gateway/bootstrap.js.map +1 -0
  406. package/dist/gateway/conn-state-machine.d.ts +25 -0
  407. package/dist/gateway/conn-state-machine.d.ts.map +1 -0
  408. package/dist/gateway/conn-state-machine.js +39 -0
  409. package/dist/gateway/conn-state-machine.js.map +1 -0
  410. package/dist/gateway/connection-state.d.ts +22 -0
  411. package/dist/gateway/connection-state.d.ts.map +1 -0
  412. package/dist/gateway/connection-state.js +60 -0
  413. package/dist/gateway/connection-state.js.map +1 -0
  414. package/dist/gateway/events/handler.d.ts +75 -0
  415. package/dist/gateway/events/handler.d.ts.map +1 -0
  416. package/dist/gateway/events/handler.js +164 -0
  417. package/dist/gateway/events/handler.js.map +1 -0
  418. package/dist/gateway/events/index.d.ts +3 -0
  419. package/dist/gateway/events/index.d.ts.map +1 -0
  420. package/dist/gateway/events/index.js +2 -0
  421. package/dist/gateway/events/index.js.map +1 -0
  422. package/dist/gateway/exit-shutdown.d.ts +5 -0
  423. package/dist/gateway/exit-shutdown.d.ts.map +1 -0
  424. package/dist/gateway/exit-shutdown.js +12 -0
  425. package/dist/gateway/exit-shutdown.js.map +1 -0
  426. package/dist/gateway/group-activation.d.ts +25 -0
  427. package/dist/gateway/group-activation.d.ts.map +1 -0
  428. package/dist/gateway/group-activation.js +78 -0
  429. package/dist/gateway/group-activation.js.map +1 -0
  430. package/dist/gateway/health/index.d.ts +3 -0
  431. package/dist/gateway/health/index.d.ts.map +1 -0
  432. package/dist/gateway/health/index.js +2 -0
  433. package/dist/gateway/health/index.js.map +1 -0
  434. package/dist/gateway/health/monitor.d.ts +63 -0
  435. package/dist/gateway/health/monitor.d.ts.map +1 -0
  436. package/dist/gateway/health/monitor.js +94 -0
  437. package/dist/gateway/health/monitor.js.map +1 -0
  438. package/dist/gateway/index.d.ts +12 -0
  439. package/dist/gateway/index.d.ts.map +1 -0
  440. package/dist/gateway/index.js +10 -0
  441. package/dist/gateway/index.js.map +1 -0
  442. package/dist/gateway/logger.d.ts +8 -0
  443. package/dist/gateway/logger.d.ts.map +1 -0
  444. package/dist/gateway/logger.js +12 -0
  445. package/dist/gateway/logger.js.map +1 -0
  446. package/dist/gateway/media-queue-worker-runtime.d.ts +16 -0
  447. package/dist/gateway/media-queue-worker-runtime.d.ts.map +1 -0
  448. package/dist/gateway/media-queue-worker-runtime.js +35 -0
  449. package/dist/gateway/media-queue-worker-runtime.js.map +1 -0
  450. package/dist/gateway/message-buffer.d.ts +9 -0
  451. package/dist/gateway/message-buffer.d.ts.map +1 -0
  452. package/dist/gateway/message-buffer.js +16 -0
  453. package/dist/gateway/message-buffer.js.map +1 -0
  454. package/dist/gateway/outgoing-messages.d.ts +4 -0
  455. package/dist/gateway/outgoing-messages.d.ts.map +1 -0
  456. package/dist/gateway/outgoing-messages.js +25 -0
  457. package/dist/gateway/outgoing-messages.js.map +1 -0
  458. package/dist/gateway/process-lifecycle.d.ts +8 -0
  459. package/dist/gateway/process-lifecycle.d.ts.map +1 -0
  460. package/dist/gateway/process-lifecycle.js +14 -0
  461. package/dist/gateway/process-lifecycle.js.map +1 -0
  462. package/dist/gateway/process-safety.d.ts +14 -0
  463. package/dist/gateway/process-safety.d.ts.map +1 -0
  464. package/dist/gateway/process-safety.js +48 -0
  465. package/dist/gateway/process-safety.js.map +1 -0
  466. package/dist/gateway/reconnect/index.d.ts +3 -0
  467. package/dist/gateway/reconnect/index.d.ts.map +1 -0
  468. package/dist/gateway/reconnect/index.js +2 -0
  469. package/dist/gateway/reconnect/index.js.map +1 -0
  470. package/dist/gateway/reconnect/manager.d.ts +59 -0
  471. package/dist/gateway/reconnect/manager.d.ts.map +1 -0
  472. package/dist/gateway/reconnect/manager.js +195 -0
  473. package/dist/gateway/reconnect/manager.js.map +1 -0
  474. package/dist/gateway/self-echo-guard.d.ts +2 -0
  475. package/dist/gateway/self-echo-guard.d.ts.map +1 -0
  476. package/dist/gateway/self-echo-guard.js +31 -0
  477. package/dist/gateway/self-echo-guard.js.map +1 -0
  478. package/dist/gateway/server.d.ts +61 -0
  479. package/dist/gateway/server.d.ts.map +1 -0
  480. package/dist/gateway/server.js +947 -0
  481. package/dist/gateway/server.js.map +1 -0
  482. package/dist/gateway/shutdown-registry.d.ts +5 -0
  483. package/dist/gateway/shutdown-registry.d.ts.map +1 -0
  484. package/dist/gateway/shutdown-registry.js +20 -0
  485. package/dist/gateway/shutdown-registry.js.map +1 -0
  486. package/dist/gateway/socket/connection.d.ts +45 -0
  487. package/dist/gateway/socket/connection.d.ts.map +1 -0
  488. package/dist/gateway/socket/connection.js +198 -0
  489. package/dist/gateway/socket/connection.js.map +1 -0
  490. package/dist/gateway/socket/index.d.ts +3 -0
  491. package/dist/gateway/socket/index.d.ts.map +1 -0
  492. package/dist/gateway/socket/index.js +3 -0
  493. package/dist/gateway/socket/index.js.map +1 -0
  494. package/dist/gateway/sync-mutex.d.ts +13 -0
  495. package/dist/gateway/sync-mutex.d.ts.map +1 -0
  496. package/dist/gateway/sync-mutex.js +26 -0
  497. package/dist/gateway/sync-mutex.js.map +1 -0
  498. package/dist/gateway/text-media.d.ts +23 -0
  499. package/dist/gateway/text-media.d.ts.map +1 -0
  500. package/dist/gateway/text-media.js +30 -0
  501. package/dist/gateway/text-media.js.map +1 -0
  502. package/dist/group-intel/engine.d.ts +77 -0
  503. package/dist/group-intel/engine.d.ts.map +1 -0
  504. package/dist/group-intel/engine.js +197 -0
  505. package/dist/group-intel/engine.js.map +1 -0
  506. package/dist/group-intel/index.d.ts +3 -0
  507. package/dist/group-intel/index.d.ts.map +1 -0
  508. package/dist/group-intel/index.js +2 -0
  509. package/dist/group-intel/index.js.map +1 -0
  510. package/dist/intent/classifier.d.ts +17 -0
  511. package/dist/intent/classifier.d.ts.map +1 -0
  512. package/dist/intent/classifier.js +89 -0
  513. package/dist/intent/classifier.js.map +1 -0
  514. package/dist/kb/store.d.ts +38 -0
  515. package/dist/kb/store.d.ts.map +1 -0
  516. package/dist/kb/store.js +114 -0
  517. package/dist/kb/store.js.map +1 -0
  518. package/dist/llm/audit.d.ts +70 -0
  519. package/dist/llm/audit.d.ts.map +1 -0
  520. package/dist/llm/audit.js +281 -0
  521. package/dist/llm/audit.js.map +1 -0
  522. package/dist/llm/base-provider.d.ts +46 -0
  523. package/dist/llm/base-provider.d.ts.map +1 -0
  524. package/dist/llm/base-provider.js +158 -0
  525. package/dist/llm/base-provider.js.map +1 -0
  526. package/dist/llm/config.d.ts +32 -0
  527. package/dist/llm/config.d.ts.map +1 -0
  528. package/dist/llm/config.js +125 -0
  529. package/dist/llm/config.js.map +1 -0
  530. package/dist/llm/direct-tool-guard.d.ts +8 -0
  531. package/dist/llm/direct-tool-guard.d.ts.map +1 -0
  532. package/dist/llm/direct-tool-guard.js +36 -0
  533. package/dist/llm/direct-tool-guard.js.map +1 -0
  534. package/dist/llm/engine.d.ts +44 -0
  535. package/dist/llm/engine.d.ts.map +1 -0
  536. package/dist/llm/engine.js +327 -0
  537. package/dist/llm/engine.js.map +1 -0
  538. package/dist/llm/index.d.ts +8 -0
  539. package/dist/llm/index.d.ts.map +1 -0
  540. package/dist/llm/index.js +8 -0
  541. package/dist/llm/index.js.map +1 -0
  542. package/dist/llm/model-settings.d.ts +57 -0
  543. package/dist/llm/model-settings.d.ts.map +1 -0
  544. package/dist/llm/model-settings.js +184 -0
  545. package/dist/llm/model-settings.js.map +1 -0
  546. package/dist/llm/ocr-client.d.ts +19 -0
  547. package/dist/llm/ocr-client.d.ts.map +1 -0
  548. package/dist/llm/ocr-client.js +94 -0
  549. package/dist/llm/ocr-client.js.map +1 -0
  550. package/dist/llm/ocr-errors.d.ts +15 -0
  551. package/dist/llm/ocr-errors.d.ts.map +1 -0
  552. package/dist/llm/ocr-errors.js +42 -0
  553. package/dist/llm/ocr-errors.js.map +1 -0
  554. package/dist/llm/ocr-registry.d.ts +33 -0
  555. package/dist/llm/ocr-registry.d.ts.map +1 -0
  556. package/dist/llm/ocr-registry.js +129 -0
  557. package/dist/llm/ocr-registry.js.map +1 -0
  558. package/dist/llm/ocr-types.d.ts +53 -0
  559. package/dist/llm/ocr-types.d.ts.map +1 -0
  560. package/dist/llm/ocr-types.js +11 -0
  561. package/dist/llm/ocr-types.js.map +1 -0
  562. package/dist/llm/providers/anthropic-ocr.d.ts +3 -0
  563. package/dist/llm/providers/anthropic-ocr.d.ts.map +1 -0
  564. package/dist/llm/providers/anthropic-ocr.js +32 -0
  565. package/dist/llm/providers/anthropic-ocr.js.map +1 -0
  566. package/dist/llm/providers/custom-ocr.d.ts +3 -0
  567. package/dist/llm/providers/custom-ocr.d.ts.map +1 -0
  568. package/dist/llm/providers/custom-ocr.js +20 -0
  569. package/dist/llm/providers/custom-ocr.js.map +1 -0
  570. package/dist/llm/providers/gemini-ocr.d.ts +3 -0
  571. package/dist/llm/providers/gemini-ocr.d.ts.map +1 -0
  572. package/dist/llm/providers/gemini-ocr.js +26 -0
  573. package/dist/llm/providers/gemini-ocr.js.map +1 -0
  574. package/dist/llm/providers/http-ocr.d.ts +12 -0
  575. package/dist/llm/providers/http-ocr.d.ts.map +1 -0
  576. package/dist/llm/providers/http-ocr.js +135 -0
  577. package/dist/llm/providers/http-ocr.js.map +1 -0
  578. package/dist/llm/providers/local-ocr.d.ts +3 -0
  579. package/dist/llm/providers/local-ocr.d.ts.map +1 -0
  580. package/dist/llm/providers/local-ocr.js +19 -0
  581. package/dist/llm/providers/local-ocr.js.map +1 -0
  582. package/dist/llm/providers/ollama-ocr.d.ts +3 -0
  583. package/dist/llm/providers/ollama-ocr.d.ts.map +1 -0
  584. package/dist/llm/providers/ollama-ocr.js +18 -0
  585. package/dist/llm/providers/ollama-ocr.js.map +1 -0
  586. package/dist/llm/providers/openai-compat.d.ts +26 -0
  587. package/dist/llm/providers/openai-compat.d.ts.map +1 -0
  588. package/dist/llm/providers/openai-compat.js +284 -0
  589. package/dist/llm/providers/openai-compat.js.map +1 -0
  590. package/dist/llm/providers/openai-compatible-ocr.d.ts +3 -0
  591. package/dist/llm/providers/openai-compatible-ocr.d.ts.map +1 -0
  592. package/dist/llm/providers/openai-compatible-ocr.js +21 -0
  593. package/dist/llm/providers/openai-compatible-ocr.js.map +1 -0
  594. package/dist/llm/providers/openai-ocr.d.ts +3 -0
  595. package/dist/llm/providers/openai-ocr.d.ts.map +1 -0
  596. package/dist/llm/providers/openai-ocr.js +25 -0
  597. package/dist/llm/providers/openai-ocr.js.map +1 -0
  598. package/dist/llm/providers/openrouter-ocr.d.ts +3 -0
  599. package/dist/llm/providers/openrouter-ocr.d.ts.map +1 -0
  600. package/dist/llm/providers/openrouter-ocr.js +21 -0
  601. package/dist/llm/providers/openrouter-ocr.js.map +1 -0
  602. package/dist/llm/response-sanitizer.d.ts +3 -0
  603. package/dist/llm/response-sanitizer.d.ts.map +1 -0
  604. package/dist/llm/response-sanitizer.js +122 -0
  605. package/dist/llm/response-sanitizer.js.map +1 -0
  606. package/dist/llm/router.d.ts +29 -0
  607. package/dist/llm/router.d.ts.map +1 -0
  608. package/dist/llm/router.js +167 -0
  609. package/dist/llm/router.js.map +1 -0
  610. package/dist/llm/safety.d.ts +15 -0
  611. package/dist/llm/safety.d.ts.map +1 -0
  612. package/dist/llm/safety.js +48 -0
  613. package/dist/llm/safety.js.map +1 -0
  614. package/dist/llm/search-planner.d.ts +4 -0
  615. package/dist/llm/search-planner.d.ts.map +1 -0
  616. package/dist/llm/search-planner.js +49 -0
  617. package/dist/llm/search-planner.js.map +1 -0
  618. package/dist/llm/task-router.d.ts +19 -0
  619. package/dist/llm/task-router.d.ts.map +1 -0
  620. package/dist/llm/task-router.js +70 -0
  621. package/dist/llm/task-router.js.map +1 -0
  622. package/dist/llm/types.d.ts +161 -0
  623. package/dist/llm/types.d.ts.map +1 -0
  624. package/dist/llm/types.js +45 -0
  625. package/dist/llm/types.js.map +1 -0
  626. package/dist/media/command-controller.d.ts +15 -0
  627. package/dist/media/command-controller.d.ts.map +1 -0
  628. package/dist/media/command-controller.js +122 -0
  629. package/dist/media/command-controller.js.map +1 -0
  630. package/dist/media/command-parse.d.ts +2 -0
  631. package/dist/media/command-parse.d.ts.map +1 -0
  632. package/dist/media/command-parse.js +5 -0
  633. package/dist/media/command-parse.js.map +1 -0
  634. package/dist/media/index.d.ts +13 -0
  635. package/dist/media/index.d.ts.map +1 -0
  636. package/dist/media/index.js +7 -0
  637. package/dist/media/index.js.map +1 -0
  638. package/dist/media/policy.d.ts +23 -0
  639. package/dist/media/policy.d.ts.map +1 -0
  640. package/dist/media/policy.js +125 -0
  641. package/dist/media/policy.js.map +1 -0
  642. package/dist/media/prep-router.d.ts +24 -0
  643. package/dist/media/prep-router.d.ts.map +1 -0
  644. package/dist/media/prep-router.js +79 -0
  645. package/dist/media/prep-router.js.map +1 -0
  646. package/dist/media/prep.d.ts +22 -0
  647. package/dist/media/prep.d.ts.map +1 -0
  648. package/dist/media/prep.js +74 -0
  649. package/dist/media/prep.js.map +1 -0
  650. package/dist/media/queue-admin.d.ts +10 -0
  651. package/dist/media/queue-admin.d.ts.map +1 -0
  652. package/dist/media/queue-admin.js +47 -0
  653. package/dist/media/queue-admin.js.map +1 -0
  654. package/dist/media/queue-runner.d.ts +28 -0
  655. package/dist/media/queue-runner.d.ts.map +1 -0
  656. package/dist/media/queue-runner.js +71 -0
  657. package/dist/media/queue-runner.js.map +1 -0
  658. package/dist/media/queue-store.d.ts +27 -0
  659. package/dist/media/queue-store.d.ts.map +1 -0
  660. package/dist/media/queue-store.js +147 -0
  661. package/dist/media/queue-store.js.map +1 -0
  662. package/dist/media/queue-types.d.ts +71 -0
  663. package/dist/media/queue-types.d.ts.map +1 -0
  664. package/dist/media/queue-types.js +2 -0
  665. package/dist/media/queue-types.js.map +1 -0
  666. package/dist/media/queue-utils.d.ts +9 -0
  667. package/dist/media/queue-utils.d.ts.map +1 -0
  668. package/dist/media/queue-utils.js +52 -0
  669. package/dist/media/queue-utils.js.map +1 -0
  670. package/dist/media/queue-worker.d.ts +31 -0
  671. package/dist/media/queue-worker.d.ts.map +1 -0
  672. package/dist/media/queue-worker.js +58 -0
  673. package/dist/media/queue-worker.js.map +1 -0
  674. package/dist/media/reliability.d.ts +58 -0
  675. package/dist/media/reliability.d.ts.map +1 -0
  676. package/dist/media/reliability.js +240 -0
  677. package/dist/media/reliability.js.map +1 -0
  678. package/dist/media/service.d.ts +53 -0
  679. package/dist/media/service.d.ts.map +1 -0
  680. package/dist/media/service.js +238 -0
  681. package/dist/media/service.js.map +1 -0
  682. package/dist/media/text-extractor.d.ts +23 -0
  683. package/dist/media/text-extractor.d.ts.map +1 -0
  684. package/dist/media/text-extractor.js +66 -0
  685. package/dist/media/text-extractor.js.map +1 -0
  686. package/dist/media/text-format.d.ts +10 -0
  687. package/dist/media/text-format.d.ts.map +1 -0
  688. package/dist/media/text-format.js +19 -0
  689. package/dist/media/text-format.js.map +1 -0
  690. package/dist/media-orchestration/engine.d.ts +74 -0
  691. package/dist/media-orchestration/engine.d.ts.map +1 -0
  692. package/dist/media-orchestration/engine.js +155 -0
  693. package/dist/media-orchestration/engine.js.map +1 -0
  694. package/dist/media-orchestration/index.d.ts +3 -0
  695. package/dist/media-orchestration/index.d.ts.map +1 -0
  696. package/dist/media-orchestration/index.js +2 -0
  697. package/dist/media-orchestration/index.js.map +1 -0
  698. package/dist/memory/index.d.ts +3 -0
  699. package/dist/memory/index.d.ts.map +1 -0
  700. package/dist/memory/index.js +2 -0
  701. package/dist/memory/index.js.map +1 -0
  702. package/dist/memory/persistent.d.ts +78 -0
  703. package/dist/memory/persistent.d.ts.map +1 -0
  704. package/dist/memory/persistent.js +254 -0
  705. package/dist/memory/persistent.js.map +1 -0
  706. package/dist/memory-isolation/engine.d.ts +83 -0
  707. package/dist/memory-isolation/engine.d.ts.map +1 -0
  708. package/dist/memory-isolation/engine.js +247 -0
  709. package/dist/memory-isolation/engine.js.map +1 -0
  710. package/dist/memory-isolation/index.d.ts +3 -0
  711. package/dist/memory-isolation/index.d.ts.map +1 -0
  712. package/dist/memory-isolation/index.js +2 -0
  713. package/dist/memory-isolation/index.js.map +1 -0
  714. package/dist/message-dedupe/engine.d.ts +67 -0
  715. package/dist/message-dedupe/engine.d.ts.map +1 -0
  716. package/dist/message-dedupe/engine.js +208 -0
  717. package/dist/message-dedupe/engine.js.map +1 -0
  718. package/dist/message-dedupe/index.d.ts +3 -0
  719. package/dist/message-dedupe/index.d.ts.map +1 -0
  720. package/dist/message-dedupe/index.js +2 -0
  721. package/dist/message-dedupe/index.js.map +1 -0
  722. package/dist/monitoring/index.d.ts +3 -0
  723. package/dist/monitoring/index.d.ts.map +1 -0
  724. package/dist/monitoring/index.js +2 -0
  725. package/dist/monitoring/index.js.map +1 -0
  726. package/dist/monitoring/leak-detector.d.ts +63 -0
  727. package/dist/monitoring/leak-detector.d.ts.map +1 -0
  728. package/dist/monitoring/leak-detector.js +169 -0
  729. package/dist/monitoring/leak-detector.js.map +1 -0
  730. package/dist/monitoring/runtime-health.d.ts +14 -0
  731. package/dist/monitoring/runtime-health.d.ts.map +1 -0
  732. package/dist/monitoring/runtime-health.js +82 -0
  733. package/dist/monitoring/runtime-health.js.map +1 -0
  734. package/dist/observability/safe-log.d.ts +3 -0
  735. package/dist/observability/safe-log.d.ts.map +1 -0
  736. package/dist/observability/safe-log.js +22 -0
  737. package/dist/observability/safe-log.js.map +1 -0
  738. package/dist/outbound/index.d.ts +3 -0
  739. package/dist/outbound/index.d.ts.map +1 -0
  740. package/dist/outbound/index.js +2 -0
  741. package/dist/outbound/index.js.map +1 -0
  742. package/dist/outbound/ledger.d.ts +78 -0
  743. package/dist/outbound/ledger.d.ts.map +1 -0
  744. package/dist/outbound/ledger.js +143 -0
  745. package/dist/outbound/ledger.js.map +1 -0
  746. package/dist/owner/config.d.ts +43 -0
  747. package/dist/owner/config.d.ts.map +1 -0
  748. package/dist/owner/config.js +110 -0
  749. package/dist/owner/config.js.map +1 -0
  750. package/dist/owner/help.d.ts +2 -0
  751. package/dist/owner/help.d.ts.map +1 -0
  752. package/dist/owner/help.js +96 -0
  753. package/dist/owner/help.js.map +1 -0
  754. package/dist/owner/identity.d.ts +45 -0
  755. package/dist/owner/identity.d.ts.map +1 -0
  756. package/dist/owner/identity.js +155 -0
  757. package/dist/owner/identity.js.map +1 -0
  758. package/dist/owner/index.d.ts +7 -0
  759. package/dist/owner/index.d.ts.map +1 -0
  760. package/dist/owner/index.js +4 -0
  761. package/dist/owner/index.js.map +1 -0
  762. package/dist/owner/ocr-help.d.ts +2 -0
  763. package/dist/owner/ocr-help.d.ts.map +1 -0
  764. package/dist/owner/ocr-help.js +13 -0
  765. package/dist/owner/ocr-help.js.map +1 -0
  766. package/dist/owner/router.d.ts +47 -0
  767. package/dist/owner/router.d.ts.map +1 -0
  768. package/dist/owner/router.js +229 -0
  769. package/dist/owner/router.js.map +1 -0
  770. package/dist/prompts/registry.d.ts +19 -0
  771. package/dist/prompts/registry.d.ts.map +1 -0
  772. package/dist/prompts/registry.js +64 -0
  773. package/dist/prompts/registry.js.map +1 -0
  774. package/dist/scheduler/alias-planner.d.ts +9 -0
  775. package/dist/scheduler/alias-planner.d.ts.map +1 -0
  776. package/dist/scheduler/alias-planner.js +57 -0
  777. package/dist/scheduler/alias-planner.js.map +1 -0
  778. package/dist/scheduler/runner.d.ts +16 -0
  779. package/dist/scheduler/runner.d.ts.map +1 -0
  780. package/dist/scheduler/runner.js +40 -0
  781. package/dist/scheduler/runner.js.map +1 -0
  782. package/dist/scheduler/store.d.ts +35 -0
  783. package/dist/scheduler/store.d.ts.map +1 -0
  784. package/dist/scheduler/store.js +104 -0
  785. package/dist/scheduler/store.js.map +1 -0
  786. package/dist/scheduler/time.d.ts +8 -0
  787. package/dist/scheduler/time.d.ts.map +1 -0
  788. package/dist/scheduler/time.js +248 -0
  789. package/dist/scheduler/time.js.map +1 -0
  790. package/dist/security/backup.d.ts +69 -0
  791. package/dist/security/backup.d.ts.map +1 -0
  792. package/dist/security/backup.js +319 -0
  793. package/dist/security/backup.js.map +1 -0
  794. package/dist/security/index.d.ts +7 -0
  795. package/dist/security/index.d.ts.map +1 -0
  796. package/dist/security/index.js +4 -0
  797. package/dist/security/index.js.map +1 -0
  798. package/dist/security/red-team.d.ts +52 -0
  799. package/dist/security/red-team.d.ts.map +1 -0
  800. package/dist/security/red-team.js +249 -0
  801. package/dist/security/red-team.js.map +1 -0
  802. package/dist/security/tester.d.ts +65 -0
  803. package/dist/security/tester.d.ts.map +1 -0
  804. package/dist/security/tester.js +218 -0
  805. package/dist/security/tester.js.map +1 -0
  806. package/dist/self-improvement/index.d.ts +2 -0
  807. package/dist/self-improvement/index.d.ts.map +1 -0
  808. package/dist/self-improvement/index.js +2 -0
  809. package/dist/self-improvement/index.js.map +1 -0
  810. package/dist/self-improvement/trace-store.d.ts +27 -0
  811. package/dist/self-improvement/trace-store.d.ts.map +1 -0
  812. package/dist/self-improvement/trace-store.js +88 -0
  813. package/dist/self-improvement/trace-store.js.map +1 -0
  814. package/dist/session/index.d.ts +9 -0
  815. package/dist/session/index.d.ts.map +1 -0
  816. package/dist/session/index.js +5 -0
  817. package/dist/session/index.js.map +1 -0
  818. package/dist/session/manager.d.ts +65 -0
  819. package/dist/session/manager.d.ts.map +1 -0
  820. package/dist/session/manager.js +265 -0
  821. package/dist/session/manager.js.map +1 -0
  822. package/dist/session/recovery.d.ts +44 -0
  823. package/dist/session/recovery.d.ts.map +1 -0
  824. package/dist/session/recovery.js +196 -0
  825. package/dist/session/recovery.js.map +1 -0
  826. package/dist/session/snapshot.d.ts +70 -0
  827. package/dist/session/snapshot.d.ts.map +1 -0
  828. package/dist/session/snapshot.js +268 -0
  829. package/dist/session/snapshot.js.map +1 -0
  830. package/dist/session/validator.d.ts +56 -0
  831. package/dist/session/validator.d.ts.map +1 -0
  832. package/dist/session/validator.js +247 -0
  833. package/dist/session/validator.js.map +1 -0
  834. package/dist/support/store.d.ts +91 -0
  835. package/dist/support/store.d.ts.map +1 -0
  836. package/dist/support/store.js +352 -0
  837. package/dist/support/store.js.map +1 -0
  838. package/dist/test/setup-env.d.ts +2 -0
  839. package/dist/test/setup-env.d.ts.map +1 -0
  840. package/dist/test/setup-env.js +34 -0
  841. package/dist/test/setup-env.js.map +1 -0
  842. package/dist/tool-runtime/access-policy.d.ts +25 -0
  843. package/dist/tool-runtime/access-policy.d.ts.map +1 -0
  844. package/dist/tool-runtime/access-policy.js +42 -0
  845. package/dist/tool-runtime/access-policy.js.map +1 -0
  846. package/dist/tool-runtime/audit.d.ts +13 -0
  847. package/dist/tool-runtime/audit.d.ts.map +1 -0
  848. package/dist/tool-runtime/audit.js +34 -0
  849. package/dist/tool-runtime/audit.js.map +1 -0
  850. package/dist/tool-runtime/engine.d.ts +154 -0
  851. package/dist/tool-runtime/engine.d.ts.map +1 -0
  852. package/dist/tool-runtime/engine.js +236 -0
  853. package/dist/tool-runtime/engine.js.map +1 -0
  854. package/dist/tool-runtime/http-executor.d.ts +19 -0
  855. package/dist/tool-runtime/http-executor.d.ts.map +1 -0
  856. package/dist/tool-runtime/http-executor.js +85 -0
  857. package/dist/tool-runtime/http-executor.js.map +1 -0
  858. package/dist/tool-runtime/identity.d.ts +25 -0
  859. package/dist/tool-runtime/identity.d.ts.map +1 -0
  860. package/dist/tool-runtime/identity.js +55 -0
  861. package/dist/tool-runtime/identity.js.map +1 -0
  862. package/dist/tool-runtime/index.d.ts +3 -0
  863. package/dist/tool-runtime/index.d.ts.map +1 -0
  864. package/dist/tool-runtime/index.js +2 -0
  865. package/dist/tool-runtime/index.js.map +1 -0
  866. package/dist/tool-runtime/manifest-loader.d.ts +6 -0
  867. package/dist/tool-runtime/manifest-loader.d.ts.map +1 -0
  868. package/dist/tool-runtime/manifest-loader.js +23 -0
  869. package/dist/tool-runtime/manifest-loader.js.map +1 -0
  870. package/dist/tool-runtime/manifest.d.ts +71 -0
  871. package/dist/tool-runtime/manifest.d.ts.map +1 -0
  872. package/dist/tool-runtime/manifest.js +467 -0
  873. package/dist/tool-runtime/manifest.js.map +1 -0
  874. package/dist/tool-runtime/mcp-executor.d.ts +12 -0
  875. package/dist/tool-runtime/mcp-executor.d.ts.map +1 -0
  876. package/dist/tool-runtime/mcp-executor.js +102 -0
  877. package/dist/tool-runtime/mcp-executor.js.map +1 -0
  878. package/dist/tool-runtime/multipart.d.ts +12 -0
  879. package/dist/tool-runtime/multipart.d.ts.map +1 -0
  880. package/dist/tool-runtime/multipart.js +47 -0
  881. package/dist/tool-runtime/multipart.js.map +1 -0
  882. package/dist/tool-runtime/oauth.d.ts +18 -0
  883. package/dist/tool-runtime/oauth.d.ts.map +1 -0
  884. package/dist/tool-runtime/oauth.js +80 -0
  885. package/dist/tool-runtime/oauth.js.map +1 -0
  886. package/dist/tool-runtime/orchestrator.d.ts +38 -0
  887. package/dist/tool-runtime/orchestrator.d.ts.map +1 -0
  888. package/dist/tool-runtime/orchestrator.js +117 -0
  889. package/dist/tool-runtime/orchestrator.js.map +1 -0
  890. package/dist/tool-runtime/planner.d.ts +23 -0
  891. package/dist/tool-runtime/planner.d.ts.map +1 -0
  892. package/dist/tool-runtime/planner.js +126 -0
  893. package/dist/tool-runtime/planner.js.map +1 -0
  894. package/dist/tool-runtime/policy.d.ts +23 -0
  895. package/dist/tool-runtime/policy.d.ts.map +1 -0
  896. package/dist/tool-runtime/policy.js +48 -0
  897. package/dist/tool-runtime/policy.js.map +1 -0
  898. package/dist/tool-runtime/response-template.d.ts +20 -0
  899. package/dist/tool-runtime/response-template.d.ts.map +1 -0
  900. package/dist/tool-runtime/response-template.js +87 -0
  901. package/dist/tool-runtime/response-template.js.map +1 -0
  902. package/dist/tool-runtime/workflow-runner.d.ts +13 -0
  903. package/dist/tool-runtime/workflow-runner.d.ts.map +1 -0
  904. package/dist/tool-runtime/workflow-runner.js +61 -0
  905. package/dist/tool-runtime/workflow-runner.js.map +1 -0
  906. package/dist/tools/crunchtrova.d.ts +78 -0
  907. package/dist/tools/crunchtrova.d.ts.map +1 -0
  908. package/dist/tools/crunchtrova.js +378 -0
  909. package/dist/tools/crunchtrova.js.map +1 -0
  910. package/dist/tools/index.d.ts +7 -0
  911. package/dist/tools/index.d.ts.map +1 -0
  912. package/dist/tools/index.js +4 -0
  913. package/dist/tools/index.js.map +1 -0
  914. package/dist/tools/input-guard.d.ts +8 -0
  915. package/dist/tools/input-guard.d.ts.map +1 -0
  916. package/dist/tools/input-guard.js +41 -0
  917. package/dist/tools/input-guard.js.map +1 -0
  918. package/dist/tools/llm-tool-definitions.d.ts +4 -0
  919. package/dist/tools/llm-tool-definitions.d.ts.map +1 -0
  920. package/dist/tools/llm-tool-definitions.js +30 -0
  921. package/dist/tools/llm-tool-definitions.js.map +1 -0
  922. package/dist/tools/model-manager.d.ts +29 -0
  923. package/dist/tools/model-manager.d.ts.map +1 -0
  924. package/dist/tools/model-manager.js +118 -0
  925. package/dist/tools/model-manager.js.map +1 -0
  926. package/dist/tools/registry.d.ts +41 -0
  927. package/dist/tools/registry.d.ts.map +1 -0
  928. package/dist/tools/registry.js +325 -0
  929. package/dist/tools/registry.js.map +1 -0
  930. package/dist/tools/search-orchestrator.d.ts +74 -0
  931. package/dist/tools/search-orchestrator.d.ts.map +1 -0
  932. package/dist/tools/search-orchestrator.js +174 -0
  933. package/dist/tools/search-orchestrator.js.map +1 -0
  934. package/dist/tools/tool-catalog-config.d.ts +103 -0
  935. package/dist/tools/tool-catalog-config.d.ts.map +1 -0
  936. package/dist/tools/tool-catalog-config.js +185 -0
  937. package/dist/tools/tool-catalog-config.js.map +1 -0
  938. package/dist/tools/tool-catalog.d.ts +24 -0
  939. package/dist/tools/tool-catalog.d.ts.map +1 -0
  940. package/dist/tools/tool-catalog.js +62 -0
  941. package/dist/tools/tool-catalog.js.map +1 -0
  942. package/dist/tools/tool-command-synthesis.d.ts +22 -0
  943. package/dist/tools/tool-command-synthesis.d.ts.map +1 -0
  944. package/dist/tools/tool-command-synthesis.js +17 -0
  945. package/dist/tools/tool-command-synthesis.js.map +1 -0
  946. package/dist/tools/tool-policy.d.ts +21 -0
  947. package/dist/tools/tool-policy.d.ts.map +1 -0
  948. package/dist/tools/tool-policy.js +66 -0
  949. package/dist/tools/tool-policy.js.map +1 -0
  950. package/dist/usage/tracker.d.ts +35 -0
  951. package/dist/usage/tracker.d.ts.map +1 -0
  952. package/dist/usage/tracker.js +141 -0
  953. package/dist/usage/tracker.js.map +1 -0
  954. package/dist/validation/event-matrix.d.ts +41 -0
  955. package/dist/validation/event-matrix.d.ts.map +1 -0
  956. package/dist/validation/event-matrix.js +119 -0
  957. package/dist/validation/event-matrix.js.map +1 -0
  958. package/dist/validation/failure-simulator.d.ts +40 -0
  959. package/dist/validation/failure-simulator.d.ts.map +1 -0
  960. package/dist/validation/failure-simulator.js +216 -0
  961. package/dist/validation/failure-simulator.js.map +1 -0
  962. package/dist/validation/function-verifier.d.ts +48 -0
  963. package/dist/validation/function-verifier.d.ts.map +1 -0
  964. package/dist/validation/function-verifier.js +128 -0
  965. package/dist/validation/function-verifier.js.map +1 -0
  966. package/dist/validation/index.d.ts +14 -0
  967. package/dist/validation/index.d.ts.map +1 -0
  968. package/dist/validation/index.js +9 -0
  969. package/dist/validation/index.js.map +1 -0
  970. package/dist/validation/route-inventory.d.ts +39 -0
  971. package/dist/validation/route-inventory.d.ts.map +1 -0
  972. package/dist/validation/route-inventory.js +413 -0
  973. package/dist/validation/route-inventory.js.map +1 -0
  974. package/dist/validation/state-machine.d.ts +51 -0
  975. package/dist/validation/state-machine.d.ts.map +1 -0
  976. package/dist/validation/state-machine.js +217 -0
  977. package/dist/validation/state-machine.js.map +1 -0
  978. package/dist/voice-pipeline/combined.d.ts +145 -0
  979. package/dist/voice-pipeline/combined.d.ts.map +1 -0
  980. package/dist/voice-pipeline/combined.js +166 -0
  981. package/dist/voice-pipeline/combined.js.map +1 -0
  982. package/dist/voice-pipeline/groq-whisper.d.ts +29 -0
  983. package/dist/voice-pipeline/groq-whisper.d.ts.map +1 -0
  984. package/dist/voice-pipeline/groq-whisper.js +138 -0
  985. package/dist/voice-pipeline/groq-whisper.js.map +1 -0
  986. package/dist/voice-pipeline/index.d.ts +5 -0
  987. package/dist/voice-pipeline/index.d.ts.map +1 -0
  988. package/dist/voice-pipeline/index.js +3 -0
  989. package/dist/voice-pipeline/index.js.map +1 -0
  990. package/docs/CLAUDE_STYLE_TOOLING_HANDOVER.md +1188 -0
  991. package/docs/admin-cli-security.md +71 -0
  992. package/docs/async-job-implementation-status.md +88 -0
  993. package/docs/async-job-workflow.md +175 -0
  994. package/docs/auth-persistence.md +18 -0
  995. package/docs/baileys-resilience.md +103 -0
  996. package/docs/chatbot-architecture-research-plan.md +80 -0
  997. package/docs/config-write-commands.md +78 -0
  998. package/docs/connector-implementation-playbook.md +182 -0
  999. package/docs/custom-connectors.md +167 -0
  1000. package/docs/docker.md +76 -0
  1001. package/docs/installation.md +384 -0
  1002. package/docs/media-worker.md +114 -0
  1003. package/docs/npm-install.md +75 -0
  1004. package/docs/production-bot-guide.md +499 -0
  1005. package/docs/production-handover.md +255 -0
  1006. package/docs/production-monitoring.md +117 -0
  1007. package/docs/routing-state-machine.md +47 -0
  1008. package/docs/support-inbox-milestones.md +159 -0
  1009. package/docs/tool-configuration-guide.md +257 -0
  1010. package/docs/tool-plugin-and-packaging-roadmap.md +278 -0
  1011. package/package.json +55 -0
@@ -0,0 +1,947 @@
1
+ /**
2
+ * WhatsApp Gateway Server
3
+ *
4
+ * Entry point for the WhatsApp automation gateway.
5
+ *
6
+ * Architecture (following OpenClaw's Gateway pattern):
7
+ *
8
+ * WhatsApp ←→ Baileys Socket ←→ Gateway ←→ Event Bus ←→ Router ←→ AI
9
+ *
10
+ * The gateway is the sole owner of the WhatsApp session.
11
+ * Nothing talks directly to WhatsApp — everything routes through here.
12
+ */
13
+ // ── Global safety net for Baileys internal media key errors ──
14
+ process.on('unhandledRejection', (reason) => {
15
+ const msg = reason?.message || String(reason);
16
+ if (msg.includes('media key') || msg.includes('empty media')) {
17
+ console.warn('[Recovered] Media key error in history sync:', msg);
18
+ return;
19
+ }
20
+ console.error('[Fatal] Unhandled rejection:', reason);
21
+ process.exit(1);
22
+ });
23
+ // ── Single-instance guard ──
24
+ if (globalThis.__BAILEYS_RUNNING__) {
25
+ console.error('[FATAL] Another gateway instance is already running. Exiting.');
26
+ process.exit(1);
27
+ }
28
+ globalThis.__BAILEYS_RUNNING__ = true;
29
+ import { SingleFileAuthStore, deepClone } from './auth/store.js';
30
+ import { SocketManager, Browsers } from './socket/index.js';
31
+ import { EventHandler } from './events/handler.js';
32
+ import { ReconnectManager } from './reconnect/manager.js';
33
+ import { HealthMonitor } from './health/monitor.js';
34
+ import { controlledReconnect } from './connection-state.js';
35
+ import { syncMutex } from './sync-mutex.js';
36
+ import { transition, isReady, ConnState } from './conn-state-machine.js';
37
+ import { bufferMessage } from './message-buffer.js';
38
+ import { getEventBus, EventType } from '../event-bus/index.js';
39
+ import { DatabaseManager } from '../database/index.js';
40
+ import { MediaService } from '../media/service.js';
41
+ import { SessionManager } from '../session/manager.js';
42
+ import { SessionSnapshotService } from '../session/snapshot.js';
43
+ import { SessionRecoveryService } from '../session/recovery.js';
44
+ import { AIResponseEngine } from '../llm/engine.js';
45
+ import { OcrClient } from '../llm/ocr-client.js';
46
+ import { OcrModelRegistry } from '../llm/ocr-registry.js';
47
+ import { ToolRegistry } from '../tools/registry.js';
48
+ import { OwnerIdentityService } from '../owner/identity.js';
49
+ import { GlobalConfigService } from '../owner/config.js';
50
+ import { OwnerRouter } from '../owner/router.js';
51
+ import { PersistentMemory } from '../memory/persistent.js';
52
+ import { GroqWhisperService } from '../voice-pipeline/groq-whisper.js';
53
+ import { ConversationOps } from '../conversation/ops.js';
54
+ import { ConversationRuntime } from '../conversation/runtime.js';
55
+ import { EventSourcingStore } from '../event-sourcing/store.js';
56
+ import { ChatRegistry } from '../chat-registry/service.js';
57
+ import { ChatStateStore } from '../chat-state/store.js';
58
+ import { checkApiKeys } from '../llm/config.js';
59
+ import { TaskModelRouter } from '../llm/task-router.js';
60
+ import { createGatewayAsyncJobWorker } from '../async-jobs/gateway-worker.js';
61
+ import { PromptRegistry } from '../prompts/registry.js';
62
+ import { isAudioTranscriptionEnabled, isImageAnalysisEnabled, isPdfAnalysisEnabled } from '../config/runtime-feature-flags.js';
63
+ import qrcode from 'qrcode-terminal';
64
+ // ─── Configuration ───────────────────────────────────────────────────────────
65
+ const AUTH_FILE_PATH = process.env.AUTH_FILE_PATH || './data/auth_state.json';
66
+ const LOG_LEVEL = process.env.LOG_LEVEL || 'info';
67
+ // ─── Logger ──────────────────────────────────────────────────────────────────
68
+ /**
69
+ * Normalize a WhatsApp JID for consistent chat identification.
70
+ * WhatsApp uses both @s.whatsapp.net (phone JID) and @lid (Lite ID)
71
+ * for the same conversation. Normalize to a stable key.
72
+ */
73
+ function normalizeChatJid(jid) {
74
+ // Strip device suffix (e.g., :4, :7)
75
+ let normalized = jid.replace(/:(\d+)@/, '@');
76
+ // LID addresses: use the LID as-is since it's already a stable identifier
77
+ if (normalized.endsWith('@lid')) {
78
+ return normalized;
79
+ }
80
+ // Group JIDs: keep as-is
81
+ if (normalized.endsWith('@g.us')) {
82
+ return normalized;
83
+ }
84
+ // Phone JIDs: strip device suffix, normalize domain
85
+ normalized = normalized.replace('@s.whatsapp.net', '@s.whatsapp.net');
86
+ return normalized;
87
+ }
88
+ function isGatewayMediaMessageType(messageType) {
89
+ return messageType === 'imageMessage' || messageType === 'videoMessage' || messageType === 'documentMessage' || messageType === 'stickerMessage' || messageType === 'audioMessage';
90
+ }
91
+ function isVisualMediaMessageType(messageType) {
92
+ return messageType === 'imageMessage' || messageType === 'documentMessage';
93
+ }
94
+ function mediaTypeFromMessageType(messageType) {
95
+ if (messageType === 'imageMessage')
96
+ return 'image';
97
+ if (messageType === 'videoMessage')
98
+ return 'video';
99
+ if (messageType === 'documentMessage')
100
+ return 'document';
101
+ if (messageType === 'stickerMessage')
102
+ return 'sticker';
103
+ if (messageType === 'audioMessage')
104
+ return 'audio';
105
+ return null;
106
+ }
107
+ function downloadResultFromParsedMedia(messageType, media) {
108
+ const mediaType = mediaTypeFromMessageType(messageType);
109
+ if (!mediaType || !media?.downloaded || !media.mediaId || !media.filePath)
110
+ return null;
111
+ return {
112
+ mediaId: media.mediaId,
113
+ filePath: media.filePath,
114
+ fileSize: media.fileSize || 0,
115
+ sha256: media.sha256 || '',
116
+ mimeType: media.mimeType || 'application/octet-stream',
117
+ fileName: media.fileName,
118
+ mediaType,
119
+ };
120
+ }
121
+ const logger = {
122
+ info: (msg, ...args) => console.log(`[Gateway] ${msg}`, ...args),
123
+ warn: (msg, ...args) => console.warn(`[Gateway] ${msg}`, ...args),
124
+ error: (msg, ...args) => console.error(`[Gateway] ${msg}`, ...args),
125
+ debug: (msg, ...args) => {
126
+ if (LOG_LEVEL === 'debug')
127
+ console.debug(`[Gateway] ${msg}`, ...args);
128
+ },
129
+ };
130
+ // ─── Gateway ─────────────────────────────────────────────────────────────────
131
+ class Gateway {
132
+ authStore;
133
+ socketManager = null;
134
+ eventHandler;
135
+ reconnectManager;
136
+ healthMonitor;
137
+ shuttingDown = false;
138
+ saveIntervals = [];
139
+ db = DatabaseManager.getInstance();
140
+ mediaService = new MediaService();
141
+ sessionManager = new SessionManager();
142
+ snapshotService = new SessionSnapshotService(AUTH_FILE_PATH);
143
+ recoveryService;
144
+ aiEngine = new AIResponseEngine();
145
+ toolRegistry = new ToolRegistry();
146
+ ownerIdentity = new OwnerIdentityService();
147
+ globalConfig = new GlobalConfigService();
148
+ ownerRouter = new OwnerRouter(this.ownerIdentity, this.globalConfig, this.toolRegistry.getModelManager());
149
+ persistentMemory = new PersistentMemory();
150
+ whisperService = new GroqWhisperService();
151
+ ocrClient = new OcrClient({ timeoutMs: Number(process.env.OCR_TIMEOUT_MS || 60_000) });
152
+ ocrRegistry = new OcrModelRegistry();
153
+ eventStore = new EventSourcingStore();
154
+ chatRegistry = new ChatRegistry(new ChatStateStore());
155
+ ops;
156
+ runtime;
157
+ asyncJobWorker = null;
158
+ promptRegistry = new PromptRegistry();
159
+ constructor() {
160
+ this.authStore = new SingleFileAuthStore(AUTH_FILE_PATH);
161
+ this.eventHandler = new EventHandler();
162
+ this.reconnectManager = new ReconnectManager({
163
+ initialDelayMs: 1_000,
164
+ maxDelayMs: 60_000,
165
+ backoffMultiplier: 2,
166
+ maxAttempts: 0, // unlimited
167
+ });
168
+ this.healthMonitor = new HealthMonitor();
169
+ this.recoveryService = new SessionRecoveryService(this.authStore, this.snapshotService);
170
+ this.ops = new ConversationOps(this.persistentMemory, new ChatStateStore(), this.chatRegistry, this.eventStore);
171
+ this.runtime = new ConversationRuntime(this.ownerIdentity, this.globalConfig, this.aiEngine, this.persistentMemory, this.toolRegistry);
172
+ this.asyncJobWorker = createGatewayAsyncJobWorker({
173
+ registry: this.toolRegistry,
174
+ sendText: (chatJid, text) => this.sendReply(chatJid, text),
175
+ onDelivered: (job, reply) => {
176
+ this.persistentMemory.store(job.chatJid, 'user', job.originalText, 'customer');
177
+ this.persistentMemory.store(job.chatJid, 'assistant', reply, 'tool');
178
+ this.persistentMemory.trim(job.chatJid, this.globalConfig.get('maxMessagesPerChat'));
179
+ },
180
+ onResult: (result) => {
181
+ if (result.due || result.succeeded || result.retried || result.failed) {
182
+ logger.info(`[AsyncJobs] tick complete: due=${result.due}, succeeded=${result.succeeded}, retried=${result.retried}, failed=${result.failed}`);
183
+ }
184
+ },
185
+ onError: (error) => logger.error('[AsyncJobs] worker error:', error.message),
186
+ answerSynthesizer: async (input) => {
187
+ const synthesisRouter = new TaskModelRouter();
188
+ const synthesisTask = synthesisRouter.isTask('tool_synthesis') ? 'tool_synthesis' : 'text_summary';
189
+ const prompt = this.promptRegistry.render('tool_result_synthesis', {
190
+ toolName: input.toolName,
191
+ toolQuery: input.toolQuery,
192
+ toolResult: input.toolResult,
193
+ userQuestion: input.userQuestion,
194
+ });
195
+ const response = await this.aiEngine.generateResponse(prompt, [], {
196
+ task: synthesisTask,
197
+ systemPromptName: null,
198
+ maxTokens: 900,
199
+ temperature: 0.2,
200
+ weakRetry: true,
201
+ });
202
+ return response.text;
203
+ },
204
+ });
205
+ }
206
+ /** Start the gateway. */
207
+ async start() {
208
+ this.shuttingDown = false;
209
+ logger.info('Starting WhatsApp Gateway...');
210
+ // ── Session ownership check ──
211
+ const isOwner = this.sessionManager.acquireOwnership();
212
+ if (!isOwner) {
213
+ logger.error('❌ Another Gateway process already owns the session. Exiting.');
214
+ process.exit(1);
215
+ }
216
+ logger.info(`Session ownership acquired (v${this.sessionManager.getVersion()})`);
217
+ // ── API Key Status ──
218
+ const keys = checkApiKeys();
219
+ if (keys.openrouter || keys.kilocode) {
220
+ logger.info('🔑 API Keys loaded:');
221
+ if (keys.openrouter)
222
+ logger.info(' OpenRouter: ✅');
223
+ if (keys.kilocode)
224
+ logger.info(' Kilocode: ✅');
225
+ }
226
+ else {
227
+ logger.warn('⚠️ No API keys found — AI responses disabled (echo mode)');
228
+ }
229
+ // Load existing auth state
230
+ const hasExistingAuth = this.authStore.loadSync();
231
+ if (hasExistingAuth) {
232
+ logger.info('Loaded existing auth session from disk');
233
+ }
234
+ else {
235
+ logger.info('No existing auth session — QR scan required');
236
+ }
237
+ // Set up reconnection handler with strict state machine (prevents deadlocks)
238
+ this.reconnectManager.onReconnect(async () => {
239
+ if (this.shuttingDown)
240
+ return;
241
+ this.healthMonitor.recordReconnectAttempt();
242
+ await controlledReconnect(async () => {
243
+ if (this.socketManager) {
244
+ await this.socketManager.disconnect();
245
+ this.socketManager = null;
246
+ }
247
+ }, async () => { await this.connect(); });
248
+ });
249
+ // Register message handler
250
+ const eventBus = getEventBus();
251
+ // History sync guard — ignore messages during initial sync to avoid media key errors
252
+ let isSyncing = true;
253
+ const SYNC_WINDOW_MS = 20_000; // 20s sync grace period
254
+ setTimeout(() => { isSyncing = false; }, SYNC_WINDOW_MS);
255
+ this.eventHandler.onMessage(async (msg) => {
256
+ // ── HARD GATE: Only process messages when READY and crypto is stable ──
257
+ if (!isReady()) {
258
+ if (msg.isNotify)
259
+ bufferMessage(msg);
260
+ return;
261
+ }
262
+ this.healthMonitor.recordMessageReceived();
263
+ // Persist message to database
264
+ this.db.insertMessage({
265
+ id: msg.key?.id || '',
266
+ remote_jid: msg.chatJid,
267
+ from_me: msg.fromMe ? 1 : 0,
268
+ sender_jid: msg.senderJid || null,
269
+ participant_jid: msg.key?.participant || null,
270
+ text_content: msg.textContent,
271
+ message_type: msg.messageType || 'unknown',
272
+ message_status: 'received',
273
+ raw_message: JSON.stringify(msg.raw),
274
+ timestamp: Number(msg.timestamp) || Date.now(),
275
+ });
276
+ // Persist chat if not exists
277
+ this.db.upsertChat({
278
+ jid: msg.chatJid,
279
+ name: null,
280
+ is_group: msg.chatJid?.includes('@g.us') ? 1 : 0,
281
+ last_message_at: new Date().toISOString(),
282
+ unread_count: 0,
283
+ });
284
+ const msgAge = Date.now() - (Number(msg.timestamp) * 1000 || Date.now());
285
+ const isRecent = msgAge < 120_000;
286
+ const isSelfChat = msg.fromMe && msg.chatJid === msg.senderJid;
287
+ const shouldRespond = !msg.fromMe || isSelfChat;
288
+ if (isVisualMediaMessageType(msg.messageType) && this.socketManager && shouldRespond && isRecent) {
289
+ logger.info(`[${msg.chatJid}] Received ${msg.messageType} with caption: ${msg.textContent || '(no caption)'}`);
290
+ await this.handleVisualMediaMessage(msg);
291
+ return;
292
+ }
293
+ // Emit to event bus
294
+ if (msg.textContent) {
295
+ logger.info(`[${msg.chatJid}] ${msg.textContent}`);
296
+ const payload = {
297
+ messageId: msg.key?.id || '',
298
+ chatJid: msg.chatJid,
299
+ senderJid: msg.senderJid,
300
+ textContent: msg.textContent,
301
+ messageType: msg.messageType || 'conversation',
302
+ timestamp: Number(msg.timestamp) || Date.now(),
303
+ isGroup: msg.chatJid?.includes('@g.us') || false,
304
+ participantJid: msg.key?.participant || undefined,
305
+ };
306
+ eventBus.emit(EventType.MESSAGE_RECEIVED, payload);
307
+ // Respond to incoming messages — only recent ones
308
+ // Allow self-chat (fromMe + ownerDetected) for command processing
309
+ if (this.socketManager && shouldRespond && isRecent) {
310
+ await this.handleIncomingMessage(msg);
311
+ }
312
+ }
313
+ else if (msg.messageType) {
314
+ // Silently skip system/infrastructure message types
315
+ if (msg.messageType === 'protocolMessage' ||
316
+ msg.messageType === 'senderKeyDistributionMessage' ||
317
+ msg.messageType === 'reactionMessage') {
318
+ return;
319
+ }
320
+ // Log non-system messages only
321
+ logger.info(`[${msg.chatJid}] Received ${msg.messageType} message`);
322
+ // Download media immediately (before CDN link expires)
323
+ const isMedia = isGatewayMediaMessageType(msg.messageType);
324
+ if (isMedia && msg.raw) {
325
+ this.mediaService.downloadFromMessage(msg.raw).then((result) => {
326
+ if (result) {
327
+ logger.info(`[Media] Downloaded ${result.mediaType}: ${result.filePath} (${result.fileSize}B)`);
328
+ if (msg.messageType === 'audioMessage') {
329
+ if (!isAudioTranscriptionEnabled()) {
330
+ logger.info('[Voice] Transcription skipped because audio transcription is turned off in chatbot settings.');
331
+ if (shouldRespond && isRecent) {
332
+ this.sendReply(msg.chatJid, 'I received the audio, but voice transcription is turned off in the chatbot settings right now.').catch((err) => {
333
+ logger.error('[Voice] Disabled-transcription reply failed:', err.message);
334
+ });
335
+ }
336
+ return;
337
+ }
338
+ // Transcribe voice note with Groq Whisper
339
+ this.whisperService.transcribe(result.filePath).then((transcript) => {
340
+ if (transcript.success) {
341
+ logger.info(`[Voice] Transcribed: "${transcript.text.slice(0, 80)}..."`);
342
+ // Feed transcribed text to AI for response
343
+ this.handleIncomingMessage({
344
+ ...msg,
345
+ textContent: `[Voice Note]: ${transcript.text}`,
346
+ messageType: 'conversation',
347
+ });
348
+ }
349
+ else {
350
+ logger.error(`[Voice] Transcription failed: ${transcript.error}`);
351
+ }
352
+ }).catch((err) => {
353
+ logger.error('[Voice] Whisper error:', err.message);
354
+ });
355
+ }
356
+ else {
357
+ eventBus.emit(EventType.MEDIA_RECEIVED, {
358
+ messageId: msg.key?.id || '',
359
+ chatJid: msg.chatJid,
360
+ senderJid: msg.senderJid,
361
+ mediaType: result.mediaType,
362
+ mimeType: result.mimeType,
363
+ fileName: result.fileName,
364
+ fileSize: result.fileSize,
365
+ caption: msg.textContent || undefined,
366
+ timestamp: Number(msg.timestamp) || Date.now(),
367
+ });
368
+ }
369
+ }
370
+ }).catch((err) => {
371
+ logger.error('[Media] Download error:', err.message);
372
+ });
373
+ }
374
+ else if (isMedia) {
375
+ // Fallback: emit event without download
376
+ if (msg.messageType === 'audioMessage') {
377
+ eventBus.emit(EventType.VOICE_RECEIVED, {
378
+ messageId: msg.key?.id || '',
379
+ chatJid: msg.chatJid,
380
+ senderJid: msg.senderJid,
381
+ ptt: true,
382
+ timestamp: Number(msg.timestamp) || Date.now(),
383
+ });
384
+ }
385
+ else {
386
+ eventBus.emit(EventType.MEDIA_RECEIVED, {
387
+ messageId: msg.key?.id || '',
388
+ chatJid: msg.chatJid,
389
+ senderJid: msg.senderJid,
390
+ mediaType: msg.messageType.replace('Message', ''),
391
+ caption: msg.textContent || undefined,
392
+ timestamp: Number(msg.timestamp) || Date.now(),
393
+ });
394
+ }
395
+ }
396
+ }
397
+ });
398
+ // Register connection state handler
399
+ this.eventHandler.onConnectionState((state) => {
400
+ if (state.qr) {
401
+ // Display QR code in terminal
402
+ logger.info('Scan the QR code below with WhatsApp:');
403
+ try {
404
+ qrcode.generate(state.qr, { small: true });
405
+ }
406
+ catch {
407
+ // Fallback if qrcode-terminal fails
408
+ console.log(state.qr);
409
+ }
410
+ }
411
+ if (state.connection === 'open') {
412
+ logger.info('✅ Connected to WhatsApp!');
413
+ this.healthMonitor.updateConnection('open');
414
+ this.healthMonitor.resetReconnectAttempts();
415
+ // Detect/refresh owner on every successful login
416
+ if (this.socketManager) {
417
+ const sock = this.socketManager.getSocket();
418
+ if (sock) {
419
+ const owner = this.ownerIdentity.detectOwner(sock);
420
+ if (owner) {
421
+ logger.info(`👑 Owner: ${owner.ownerJid} (phone: ${owner.ownerPhone})`);
422
+ }
423
+ }
424
+ }
425
+ else {
426
+ this.ownerIdentity.updateLastSeen();
427
+ }
428
+ const connPayload = { state: 'open' };
429
+ eventBus.emit(EventType.CONNECTION_STATE_CHANGED, connPayload);
430
+ }
431
+ else if (state.connection === 'close') {
432
+ logger.warn('Connection closed');
433
+ this.healthMonitor.updateConnection('close');
434
+ // 515 restartRequired is NORMAL after pairing — reconnect immediately
435
+ const isRestartRequired = state.lastDisconnect?.reason?.includes('515');
436
+ const connPayload = {
437
+ state: 'close',
438
+ lastDisconnectReason: state.lastDisconnect?.reason,
439
+ };
440
+ eventBus.emit(EventType.CONNECTION_STATE_CHANGED, connPayload);
441
+ // Only reconnect if not shutting down
442
+ if (!this.shuttingDown) {
443
+ this.reconnectManager.handleConnectionUpdate(state);
444
+ }
445
+ }
446
+ else if (state.connection === 'connecting') {
447
+ this.healthMonitor.updateConnection('connecting');
448
+ }
449
+ });
450
+ // Connect — use pairing code if phone number provided
451
+ const pairingPhone = process.env.WA_PAIRING_PHONE;
452
+ if (pairingPhone) {
453
+ logger.info(`Using pairing code for: ${pairingPhone}`);
454
+ }
455
+ await this.connect(pairingPhone);
456
+ if (this.asyncJobWorker?.start()) {
457
+ logger.info('[AsyncJobs] worker started');
458
+ }
459
+ // Start periodic session snapshots
460
+ this.snapshotService.startPeriodicSnapshots();
461
+ }
462
+ /** Establish a WhatsApp connection. */
463
+ async connect(pairingPhone) {
464
+ if (this.shuttingDown)
465
+ return;
466
+ transition(ConnState.CONNECTING);
467
+ try {
468
+ // Fully destroy old socket before creating new one
469
+ if (this.socketManager) {
470
+ await this.socketManager.disconnect();
471
+ this.socketManager = null;
472
+ }
473
+ // Re-validate auth before reconnect (prevents handshake failures from stale creds)
474
+ const isValid = await this.recoveryService.validateBeforeConnect();
475
+ if (!isValid) {
476
+ logger.error('Auth validation failed — credentials may be corrupted');
477
+ this.snapshotService.rollbackToLatest();
478
+ }
479
+ // Deep-clone auth state to prevent shared mutable state between sockets.
480
+ // Baileys mutates creds in-place during connection lifecycle (me.lid, registered, etc.).
481
+ // Sharing the same object causes Signal session corruption on reconnect.
482
+ const authState = deepClone(this.authStore.getAuthState());
483
+ this.socketManager = new SocketManager({
484
+ auth: authState,
485
+ browser: Browsers.macOS('Desktop'),
486
+ });
487
+ const { sock } = await this.socketManager.createSocket();
488
+ const baileysEv = sock.ev;
489
+ // ── Prekey refresh + state transition on successful connection ──
490
+ let readyTransitioned = false;
491
+ sock.ev.on('connection.update', async (update) => {
492
+ const u = update;
493
+ if (u.connection === 'open') {
494
+ transition(ConnState.SYNCING);
495
+ try {
496
+ this.authStore.updateCreds(sock.authState.creds);
497
+ await this.authStore.save();
498
+ logger.info('[AuthStore] Saved auth state after connection open');
499
+ }
500
+ catch (err) {
501
+ logger.error('Failed to save auth state after connection open:', err.message);
502
+ }
503
+ if (!readyTransitioned) {
504
+ readyTransitioned = true;
505
+ try {
506
+ const keys = sock.authState.keys;
507
+ const count = keys?.getPreKeysCount?.() ?? 0;
508
+ if (count < 10) {
509
+ logger.info(`[Prekey] Only ${count} prekeys — regenerating to 50...`);
510
+ await sock.uploadPreKeys(50);
511
+ logger.info('[Prekey] Regeneration complete');
512
+ }
513
+ // Transition to READY after prekeys are confirmed
514
+ transition(ConnState.READY);
515
+ logger.info('[Gateway] ✅ READY — processing messages now');
516
+ }
517
+ catch (e) {
518
+ logger.warn('[Prekey] Refresh failed — continuing anyway:', e.message);
519
+ transition(ConnState.READY); // Still go READY even if prekeys fail
520
+ }
521
+ }
522
+ }
523
+ ;
524
+ });
525
+ // ── Pairing code + crypto recovery ──
526
+ if (pairingPhone) {
527
+ sock.ev.on('connection.update', async (update) => {
528
+ const u = update;
529
+ if (u.qr) {
530
+ try {
531
+ const code = await sock.requestPairingCode(pairingPhone);
532
+ logger.info(`📱 Pairing code: ${code}`);
533
+ logger.info('Enter this code on your phone when prompted');
534
+ }
535
+ catch (err) {
536
+ logger.error('Failed to request pairing code:', err.message);
537
+ }
538
+ }
539
+ });
540
+ }
541
+ // ── Crypto session recovery: intercept Signal protocol errors ──
542
+ sock.ev.on('connection.update', (update) => {
543
+ const u = update;
544
+ if (u.connection === 'open') {
545
+ const originalOnUnexpected = sock.onUnexpectedError;
546
+ if (originalOnUnexpected) {
547
+ sock.onUnexpectedError = (err, msg) => {
548
+ const errMsg = err?.message || '';
549
+ if (errMsg.includes('MessageCounter') ||
550
+ errMsg.includes('Key used already') ||
551
+ errMsg.includes('No matching sessions') ||
552
+ errMsg.includes('Invalid PreKey') ||
553
+ errMsg.includes('Bad MAC') ||
554
+ errMsg.includes('SessionError') ||
555
+ errMsg.includes('Failed to decrypt')) {
556
+ logger.warn(`[Crypto] Recoverable session error in '${msg}': ${errMsg}`);
557
+ Promise.resolve(sock.authState.keys.set({ session: {} })).catch(() => { });
558
+ return;
559
+ }
560
+ originalOnUnexpected(err, msg);
561
+ };
562
+ }
563
+ }
564
+ });
565
+ baileysEv.on('creds.update', async (creds) => {
566
+ this.authStore.updateCreds(creds);
567
+ try {
568
+ await this.authStore.save();
569
+ }
570
+ catch (err) {
571
+ logger.error('Failed to save auth state after creds.update:', err.message);
572
+ }
573
+ });
574
+ baileysEv.on('connection.update', (update) => {
575
+ const connUpdate = update;
576
+ const conn = connUpdate.connection;
577
+ // ── DEBUG: Full connection.update logging for pairing diagnostics ──
578
+ if (conn === 'close' || connUpdate.lastDisconnect || connUpdate.qr) {
579
+ const ld = connUpdate.lastDisconnect;
580
+ logger.info('📡 RAW connection.update:', JSON.stringify({
581
+ connection: connUpdate.connection,
582
+ isNewLogin: connUpdate.isNewLogin,
583
+ qr: connUpdate.qr ? '(QR - see above)' : undefined,
584
+ lastDisconnect: ld
585
+ ? {
586
+ date: ld.date,
587
+ error: ld.error instanceof Error ? ld.error.message : String(ld.error),
588
+ statusCode: ld.error instanceof Error
589
+ ? ld.error.statusCode
590
+ : undefined,
591
+ }
592
+ : undefined,
593
+ receivedPendingNotifications: connUpdate.receivedPendingNotifications,
594
+ isOnline: connUpdate.isOnline,
595
+ }));
596
+ }
597
+ // Don't process connection updates during shutdown
598
+ if (this.shuttingDown && conn === 'close')
599
+ return;
600
+ // Reset chat state on sync corruption to break retry loops
601
+ if (conn === 'close') {
602
+ transition(ConnState.RECONNECTING);
603
+ const errMsg = connUpdate.lastDisconnect?.error?.message || '';
604
+ if (errMsg.includes('Invalid patch mac') || errMsg.includes('decodeSyncdPatch')) {
605
+ logger.warn('[Sync] Chat state corrupted — sync mutex will prevent parallel mutations on reconnect');
606
+ }
607
+ }
608
+ this.eventHandler.handleConnectionUpdate(update);
609
+ });
610
+ baileysEv.on('messages.upsert', (msg) => {
611
+ if (this.shuttingDown)
612
+ return;
613
+ syncMutex.run(() => this.eventHandler.handleMessagesUpsert(msg)).catch((err) => {
614
+ logger.error('[MessagesUpsert] Handler error:', err);
615
+ });
616
+ });
617
+ // ── Error 463 recovery: refresh privacy tokens on delivery failure ──
618
+ // Baileys v6.7.23 doesn't auto-recover from error 463 (MissingTcToken).
619
+ // The fix (PR #2517) was added after this version. We implement it here.
620
+ const inFlight463Recoveries = new Set();
621
+ baileysEv.on('messages.update', (updates) => {
622
+ const items = updates;
623
+ for (const item of items) {
624
+ if (item.update?.status === 'ERROR' && item.update?.messageStubParameters?.includes('463')) {
625
+ const jid = item.key?.remoteJid;
626
+ if (jid && !inFlight463Recoveries.has(jid)) {
627
+ inFlight463Recoveries.add(jid);
628
+ logger.warn(`[Error463] MissingTcToken for ${jid} — refreshing privacy token`);
629
+ // Best-effort: issue a new privacy token
630
+ sock.query({
631
+ tag: 'iq',
632
+ attrs: { to: '@s.whatsapp.net', type: 'set', xmlns: 'privacy' },
633
+ content: [{ tag: 'tctoken', attrs: { jid }, content: undefined }]
634
+ }).catch(() => { }).finally(() => {
635
+ setTimeout(() => inFlight463Recoveries.delete(jid), 30_000);
636
+ });
637
+ }
638
+ }
639
+ }
640
+ });
641
+ // Periodically save auth state (every 30 seconds)
642
+ const saveInterval = setInterval(async () => {
643
+ try {
644
+ await this.authStore.save();
645
+ }
646
+ catch (err) {
647
+ logger.error('Failed to save auth state:', err.message);
648
+ }
649
+ }, 30_000);
650
+ this.saveIntervals.push(saveInterval);
651
+ // Clean up interval on disconnect
652
+ baileysEv.on('connection.update', (update) => {
653
+ const connUpdate = update;
654
+ if (connUpdate.connection === 'close') {
655
+ clearInterval(saveInterval);
656
+ this.saveIntervals = this.saveIntervals.filter((i) => i !== saveInterval);
657
+ }
658
+ });
659
+ }
660
+ catch (err) {
661
+ logger.error('Connection failed:', err.message);
662
+ if (!this.shuttingDown) {
663
+ this.reconnectManager.handleConnectionUpdate({
664
+ connection: 'close',
665
+ lastDisconnect: { date: new Date(), reason: err.message },
666
+ });
667
+ }
668
+ }
669
+ }
670
+ /** Echo a message back (fallback when no API keys). */
671
+ async echoMessage(msg) {
672
+ if (!this.socketManager || msg.fromMe)
673
+ return;
674
+ try {
675
+ // Simulate typing for natural feel
676
+ await this.socketManager.sendPresenceUpdate('composing', msg.chatJid);
677
+ await new Promise((resolve) => setTimeout(resolve, 1500));
678
+ const echoText = `Echo: ${msg.textContent}`;
679
+ const result = await this.socketManager.sendText(msg.chatJid, echoText);
680
+ this.healthMonitor.recordMessageSent();
681
+ logger.info(`[${msg.chatJid}] Sent: ${echoText}`);
682
+ // Persist sent message
683
+ const sentId = result?.key?.id || '';
684
+ this.db.insertMessage({
685
+ id: sentId,
686
+ remote_jid: msg.chatJid,
687
+ from_me: 1,
688
+ sender_jid: null,
689
+ participant_jid: null,
690
+ text_content: echoText,
691
+ message_type: 'conversation',
692
+ message_status: 'delivered',
693
+ raw_message: JSON.stringify(result),
694
+ timestamp: Date.now(),
695
+ });
696
+ // Emit message sent event
697
+ getEventBus().emit(EventType.MESSAGE_SENT, {
698
+ messageId: sentId,
699
+ chatJid: msg.chatJid,
700
+ textContent: echoText,
701
+ timestamp: Date.now(),
702
+ });
703
+ await this.socketManager.sendPresenceUpdate('paused', msg.chatJid);
704
+ }
705
+ catch (err) {
706
+ logger.error('Failed to echo message:', err.message);
707
+ }
708
+ }
709
+ /** AI-powered response using OpenRouter/Kilocode. */
710
+ async aiRespond(msg, history, options) {
711
+ // Allow self-chat (where chatJid === senderJid) for owner commands
712
+ const isSelfChat = msg.fromMe && msg.chatJid === msg.senderJid;
713
+ if (!this.socketManager || !msg.textContent)
714
+ return;
715
+ if (msg.fromMe && !isSelfChat)
716
+ return; // Only block non-self fromMe messages
717
+ try {
718
+ await this.socketManager.sendPresenceUpdate('composing', msg.chatJid);
719
+ const startTime = Date.now();
720
+ const response = await this.aiEngine.generateResponse(msg.textContent, history, options);
721
+ const latency = Date.now() - startTime;
722
+ if (response.text && response.text.length > 0) {
723
+ await this.sendReply(msg.chatJid, response.text, response);
724
+ this.healthMonitor.recordMessageSent();
725
+ logger.info(`[AI] ${msg.chatJid} ← ${response.text.slice(0, 50)}... (${response.model}, ${latency}ms)`);
726
+ // Persist to memory
727
+ this.persistentMemory.store(msg.chatJid, 'assistant', response.text);
728
+ const sentId = `sent_${Date.now()}`;
729
+ this.db.insertMessage({
730
+ id: sentId,
731
+ remote_jid: msg.chatJid,
732
+ from_me: 1,
733
+ sender_jid: null,
734
+ participant_jid: null,
735
+ text_content: response.text,
736
+ message_type: 'conversation',
737
+ message_status: 'delivered',
738
+ raw_message: JSON.stringify(response),
739
+ timestamp: Date.now(),
740
+ });
741
+ getEventBus().emit(EventType.MESSAGE_SENT, {
742
+ messageId: sentId,
743
+ chatJid: msg.chatJid,
744
+ textContent: response.text,
745
+ timestamp: Date.now(),
746
+ });
747
+ }
748
+ await this.socketManager.sendPresenceUpdate('paused', msg.chatJid);
749
+ }
750
+ catch (err) {
751
+ logger.error('AI response failed:', err.message);
752
+ // Fallback to echo on AI failure
753
+ await this.echoMessage(msg);
754
+ }
755
+ }
756
+ async analyzeVisualMedia(downloaded, caption) {
757
+ const isPdf = downloaded.mediaType === 'document' && /pdf/i.test(downloaded.mimeType || downloaded.fileName || '');
758
+ const task = isPdf ? 'pdf_summary' : 'vision_ocr';
759
+ const selected = this.ocrRegistry.require(task);
760
+ if (!selected.ok) {
761
+ return `MEDIA_ANALYSIS_FAILED: ${selected.reason}. Configure ${task} in config/llm.settings.json or the matching TASK_* env overrides.`;
762
+ }
763
+ const captionLine = caption?.trim()
764
+ ? `The user attached this media and asked: "${caption.trim()}"`
765
+ : 'The user attached this media and wants to know what it is for.';
766
+ const prompt = this.promptRegistry.render(isPdf ? 'media_pdf_summary' : 'media_image_analysis', { captionLine });
767
+ const runOcr = (profile) => this.ocrClient.run({
768
+ task,
769
+ filePath: downloaded.filePath,
770
+ mimeType: downloaded.mimeType,
771
+ fileName: downloaded.fileName,
772
+ prompt,
773
+ profile,
774
+ });
775
+ const result = await runOcr(selected.profile);
776
+ if (result.ok)
777
+ return result.text;
778
+ const fallback = this.ocrRegistry.requireFallback(task);
779
+ if (fallback.ok) {
780
+ logger.warn(`[MediaAnalysisFallback] ${JSON.stringify({
781
+ task,
782
+ failedProvider: selected.profile.provider,
783
+ failedModel: selected.profile.model,
784
+ fallbackProvider: fallback.profile.provider,
785
+ fallbackModel: fallback.profile.model,
786
+ reason: result.errorMessage,
787
+ })}`);
788
+ const fallbackResult = await runOcr(fallback.profile);
789
+ if (fallbackResult.ok)
790
+ return fallbackResult.text;
791
+ return `MEDIA_ANALYSIS_FAILED: ${result.errorMessage}; fallback ${fallback.profile.provider}/${fallback.profile.model} also failed: ${fallbackResult.errorMessage}`;
792
+ }
793
+ return `MEDIA_ANALYSIS_FAILED: ${result.errorMessage}`;
794
+ }
795
+ async handleVisualMediaMessage(msg) {
796
+ if (!this.socketManager)
797
+ return;
798
+ const caption = msg.textContent && !msg.textContent.startsWith('[media:') ? msg.textContent : 'What is this for?';
799
+ let downloaded = downloadResultFromParsedMedia(msg.messageType, msg.media);
800
+ if (!downloaded && msg.raw) {
801
+ downloaded = await this.mediaService.downloadFromMessage(msg.raw);
802
+ }
803
+ if (!downloaded) {
804
+ await this.sendReply(msg.chatJid, `I received the ${msg.messageType?.replace('Message', '') || 'media'}, but I couldn't download it for analysis. Please resend it once more.`);
805
+ return;
806
+ }
807
+ logger.info(`[Media] Downloaded ${downloaded.mediaType}: ${downloaded.filePath} (${downloaded.fileSize}B)`);
808
+ const isPdf = downloaded.mediaType === 'document' && /pdf/i.test(downloaded.mimeType || downloaded.fileName || '');
809
+ const mediaAnalysisEnabled = isPdf ? isPdfAnalysisEnabled() : isImageAnalysisEnabled();
810
+ if (!mediaAnalysisEnabled) {
811
+ const mediaLabel = isPdf ? 'PDF analysis' : 'image analysis';
812
+ logger.info(`[MediaAnalysisDisabled] ${JSON.stringify({
813
+ chatJid: msg.chatJid,
814
+ messageId: msg.key?.id || '',
815
+ mediaType: downloaded.mediaType,
816
+ mimeType: downloaded.mimeType,
817
+ })}`);
818
+ await this.sendReply(msg.chatJid, `I received the ${isPdf ? 'PDF' : 'image'}, but ${mediaLabel} is turned off in the chatbot settings right now.`);
819
+ return;
820
+ }
821
+ getEventBus().emit(EventType.MEDIA_RECEIVED, {
822
+ messageId: msg.key?.id || '',
823
+ chatJid: msg.chatJid,
824
+ senderJid: msg.senderJid,
825
+ mediaType: downloaded.mediaType,
826
+ mimeType: downloaded.mimeType,
827
+ fileName: downloaded.fileName,
828
+ fileSize: downloaded.fileSize,
829
+ caption,
830
+ timestamp: Number(msg.timestamp) || Date.now(),
831
+ });
832
+ const analysis = await this.analyzeVisualMedia(downloaded, caption);
833
+ if (analysis.startsWith('MEDIA_ANALYSIS_FAILED:')) {
834
+ logger.warn(`[MediaAnalysisFailed] ${JSON.stringify({
835
+ chatJid: msg.chatJid,
836
+ messageId: msg.key?.id || '',
837
+ mediaType: downloaded.mediaType,
838
+ mimeType: downloaded.mimeType,
839
+ fileName: downloaded.fileName,
840
+ filePath: downloaded.filePath,
841
+ reason: analysis.replace('MEDIA_ANALYSIS_FAILED: ', ''),
842
+ })}`);
843
+ await this.sendReply(msg.chatJid, analysis.replace('MEDIA_ANALYSIS_FAILED: ', 'I received the image, but I could not analyze it yet: '));
844
+ return;
845
+ }
846
+ await this.handleIncomingMessage({
847
+ ...msg,
848
+ messageType: 'conversation',
849
+ textContent: this.promptRegistry.render('media_answer_context', { caption, analysis }),
850
+ });
851
+ }
852
+ /** Route incoming message: OwnerRouter → commands/tools → AI. */
853
+ /** Single entry point — delegates to ConversationRuntime. */
854
+ async handleIncomingMessage(msg) {
855
+ if (!msg.textContent || !this.socketManager)
856
+ return;
857
+ const result = await this.runtime.processMessage(msg);
858
+ if (result.reply) {
859
+ await this.sendReply(msg.chatJid, result.reply);
860
+ }
861
+ }
862
+ async sendReply(chatJid, text, logRaw) {
863
+ if (!this.socketManager)
864
+ return;
865
+ // Sanitize: strip JSON blocks, code fences, raw data structures
866
+ let clean = text
867
+ .replace(/```[\s\S]*?```/g, '')
868
+ .replace(/\{[\s\S]*?"query"[\s\S]*?\}/g, '')
869
+ .replace(/\[[\s\S]*?"results"[\s\S]*?\]/g, '')
870
+ .replace(/ +/g, ' ')
871
+ .trim();
872
+ // Enforce WhatsApp-friendly length
873
+ if (clean.length > 4000)
874
+ clean = clean.slice(0, 3997) + '...';
875
+ if (!clean)
876
+ clean = 'I could not create a safe reply from that result. Please try again or ask the owner to check logs.';
877
+ await this.socketManager.sendPresenceUpdate('composing', chatJid);
878
+ await this.socketManager.sendText(chatJid, clean);
879
+ this.healthMonitor.recordMessageSent();
880
+ logger.info(`[REPLY] ${chatJid} ← ${clean.slice(0, 50)}...`);
881
+ // Log raw data for debugging but never send it
882
+ if (logRaw)
883
+ logger.debug('[REPLY_RAW]', JSON.stringify(logRaw).slice(0, 500));
884
+ await this.socketManager.sendPresenceUpdate('paused', chatJid);
885
+ }
886
+ getHealth() {
887
+ return this.healthMonitor.getStatus();
888
+ }
889
+ /** Graceful shutdown. */
890
+ async shutdown() {
891
+ this.shuttingDown = true;
892
+ logger.info('Shutting down...');
893
+ // Clear all save intervals
894
+ for (const interval of this.saveIntervals) {
895
+ clearInterval(interval);
896
+ }
897
+ this.saveIntervals = [];
898
+ // Stop async job worker
899
+ this.asyncJobWorker?.stop();
900
+ // Stop reconnect attempts
901
+ this.reconnectManager.destroy();
902
+ // Stop periodic snapshots
903
+ this.snapshotService.stopPeriodicSnapshots();
904
+ // Save auth state one last time
905
+ try {
906
+ await this.authStore.save();
907
+ }
908
+ catch (err) {
909
+ logger.error('Failed to save auth state on shutdown:', err.message);
910
+ }
911
+ // Disconnect socket
912
+ if (this.socketManager) {
913
+ await this.socketManager.disconnect();
914
+ }
915
+ // Release session ownership
916
+ this.sessionManager.releaseOwnership();
917
+ logger.info('Gateway shut down');
918
+ }
919
+ }
920
+ // ─── Start ───────────────────────────────────────────────────────────────────
921
+ let gateway = null;
922
+ async function main() {
923
+ gateway = new Gateway();
924
+ // Handle graceful shutdown
925
+ const shutdown = async (signal) => {
926
+ logger.info(`Received ${signal} — shutting down`);
927
+ if (gateway)
928
+ await gateway.shutdown();
929
+ process.exit(0);
930
+ };
931
+ process.on('SIGINT', () => shutdown('SIGINT'));
932
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
933
+ process.on('uncaughtException', (err) => {
934
+ logger.error('Uncaught exception:', err.message);
935
+ shutdown('uncaughtException').catch(() => process.exit(1));
936
+ });
937
+ process.on('unhandledRejection', (reason) => {
938
+ logger.error('Unhandled rejection:', reason);
939
+ });
940
+ await gateway.start();
941
+ }
942
+ main().catch((err) => {
943
+ console.error('Fatal error:', err);
944
+ process.exit(1);
945
+ });
946
+ export { Gateway };
947
+ //# sourceMappingURL=server.js.map