agent-nuvira 2.7.3 → 3.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 (366) hide show
  1. package/dist/agents/agents/writer-tool-calling.d.ts +14 -0
  2. package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
  3. package/dist/agents/agents/writer-tool-calling.js +20 -0
  4. package/dist/agents/agents/writer-tool-calling.js.map +1 -1
  5. package/dist/agents/agents/writer.d.ts.map +1 -1
  6. package/dist/agents/agents/writer.js +15 -4
  7. package/dist/agents/agents/writer.js.map +1 -1
  8. package/dist/agents/edit-module.d.ts +7 -0
  9. package/dist/agents/edit-module.d.ts.map +1 -1
  10. package/dist/agents/edit-module.js +21 -6
  11. package/dist/agents/edit-module.js.map +1 -1
  12. package/dist/agents/orchestrator.d.ts +40 -0
  13. package/dist/agents/orchestrator.d.ts.map +1 -1
  14. package/dist/agents/orchestrator.js +116 -27
  15. package/dist/agents/orchestrator.js.map +1 -1
  16. package/dist/agents/tool-calling-agent.d.ts +19 -0
  17. package/dist/agents/tool-calling-agent.d.ts.map +1 -1
  18. package/dist/agents/tool-calling-agent.js +42 -2
  19. package/dist/agents/tool-calling-agent.js.map +1 -1
  20. package/dist/cli/chat.d.ts +55 -1
  21. package/dist/cli/chat.d.ts.map +1 -1
  22. package/dist/cli/chat.js +239 -63
  23. package/dist/cli/chat.js.map +1 -1
  24. package/dist/cli/cli-program.d.ts +6 -0
  25. package/dist/cli/cli-program.d.ts.map +1 -0
  26. package/dist/cli/cli-program.js +222 -0
  27. package/dist/cli/cli-program.js.map +1 -0
  28. package/dist/cli/edit.d.ts.map +1 -1
  29. package/dist/cli/edit.js +18 -3
  30. package/dist/cli/edit.js.map +1 -1
  31. package/dist/cli/execute.d.ts.map +1 -1
  32. package/dist/cli/execute.js +29 -5
  33. package/dist/cli/execute.js.map +1 -1
  34. package/dist/cli/failover-runner.d.ts +13 -0
  35. package/dist/cli/failover-runner.d.ts.map +1 -1
  36. package/dist/cli/failover-runner.js +11 -0
  37. package/dist/cli/failover-runner.js.map +1 -1
  38. package/dist/cli/gateway.d.ts +16 -0
  39. package/dist/cli/gateway.d.ts.map +1 -1
  40. package/dist/cli/gateway.js +108 -2
  41. package/dist/cli/gateway.js.map +1 -1
  42. package/dist/cli/loop-executor.d.ts.map +1 -1
  43. package/dist/cli/loop-executor.js +245 -12
  44. package/dist/cli/loop-executor.js.map +1 -1
  45. package/dist/cli/plan.d.ts.map +1 -1
  46. package/dist/cli/plan.js +20 -6
  47. package/dist/cli/plan.js.map +1 -1
  48. package/dist/cli/process-control.d.ts +10 -0
  49. package/dist/cli/process-control.d.ts.map +1 -1
  50. package/dist/cli/process-control.js +73 -7
  51. package/dist/cli/process-control.js.map +1 -1
  52. package/dist/cli/router.d.ts +16 -5
  53. package/dist/cli/router.d.ts.map +1 -1
  54. package/dist/cli/router.js +31 -206
  55. package/dist/cli/router.js.map +1 -1
  56. package/dist/config/paths.d.ts +23 -0
  57. package/dist/config/paths.d.ts.map +1 -1
  58. package/dist/config/paths.js +30 -0
  59. package/dist/config/paths.js.map +1 -1
  60. package/dist/config/provider-env.d.ts +37 -0
  61. package/dist/config/provider-env.d.ts.map +1 -0
  62. package/dist/config/provider-env.js +86 -0
  63. package/dist/config/provider-env.js.map +1 -0
  64. package/dist/context/history.d.ts.map +1 -1
  65. package/dist/context/history.js +24 -8
  66. package/dist/context/history.js.map +1 -1
  67. package/dist/context/session-recall.d.ts +30 -0
  68. package/dist/context/session-recall.d.ts.map +1 -1
  69. package/dist/context/session-recall.js +61 -0
  70. package/dist/context/session-recall.js.map +1 -1
  71. package/dist/file.js +0 -1
  72. package/dist/file.js.map +1 -1
  73. package/dist/gateway/adapters.d.ts +10 -0
  74. package/dist/gateway/adapters.d.ts.map +1 -1
  75. package/dist/gateway/adapters.js +4 -1
  76. package/dist/gateway/adapters.js.map +1 -1
  77. package/dist/gateway/dedup.d.ts +105 -0
  78. package/dist/gateway/dedup.d.ts.map +1 -0
  79. package/dist/gateway/dedup.js +160 -0
  80. package/dist/gateway/dedup.js.map +1 -0
  81. package/dist/gateway/heartbeat.d.ts +99 -0
  82. package/dist/gateway/heartbeat.d.ts.map +1 -0
  83. package/dist/gateway/heartbeat.js +122 -0
  84. package/dist/gateway/heartbeat.js.map +1 -0
  85. package/dist/gateway/inbox.d.ts +14 -1
  86. package/dist/gateway/inbox.d.ts.map +1 -1
  87. package/dist/gateway/inbox.js.map +1 -1
  88. package/dist/gateway/platform-config.d.ts +5 -0
  89. package/dist/gateway/platform-config.d.ts.map +1 -1
  90. package/dist/gateway/platform-config.js +8 -13
  91. package/dist/gateway/platform-config.js.map +1 -1
  92. package/dist/gateway/registry.d.ts +47 -0
  93. package/dist/gateway/registry.d.ts.map +1 -1
  94. package/dist/gateway/registry.js +227 -21
  95. package/dist/gateway/registry.js.map +1 -1
  96. package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
  97. package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
  98. package/dist/gateway/whatsapp/baileys-bridge.js +64 -1
  99. package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
  100. package/dist/gateway/whatsapp/bridge.d.ts +4 -2
  101. package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
  102. package/dist/gateway/whatsapp/bridge.js.map +1 -1
  103. package/dist/index.js +1 -1
  104. package/dist/index.js.map +1 -1
  105. package/dist/inference/factory.d.ts +16 -0
  106. package/dist/inference/factory.d.ts.map +1 -1
  107. package/dist/inference/factory.js +42 -0
  108. package/dist/inference/factory.js.map +1 -1
  109. package/dist/inference/gemini-adapter.d.ts.map +1 -1
  110. package/dist/inference/gemini-adapter.js +3 -0
  111. package/dist/inference/gemini-adapter.js.map +1 -1
  112. package/dist/inference/interface.d.ts +12 -0
  113. package/dist/inference/interface.d.ts.map +1 -1
  114. package/dist/inference/local-adapter.d.ts +2 -0
  115. package/dist/inference/local-adapter.d.ts.map +1 -1
  116. package/dist/inference/local-adapter.js +36 -5
  117. package/dist/inference/local-adapter.js.map +1 -1
  118. package/dist/inference/native-tools.d.ts +8 -0
  119. package/dist/inference/native-tools.d.ts.map +1 -1
  120. package/dist/inference/native-tools.js +14 -3
  121. package/dist/inference/native-tools.js.map +1 -1
  122. package/dist/inference/tool-call-utils.d.ts +66 -7
  123. package/dist/inference/tool-call-utils.d.ts.map +1 -1
  124. package/dist/inference/tool-call-utils.js +134 -13
  125. package/dist/inference/tool-call-utils.js.map +1 -1
  126. package/dist/learning/auto-router.d.ts.map +1 -1
  127. package/dist/learning/auto-router.js +90 -5
  128. package/dist/learning/auto-router.js.map +1 -1
  129. package/dist/learning/context-budget.d.ts +133 -0
  130. package/dist/learning/context-budget.d.ts.map +1 -0
  131. package/dist/learning/context-budget.js +196 -0
  132. package/dist/learning/context-budget.js.map +1 -0
  133. package/dist/learning/cost-tracker.d.ts.map +1 -1
  134. package/dist/learning/cost-tracker.js +20 -8
  135. package/dist/learning/cost-tracker.js.map +1 -1
  136. package/dist/learning/eval-framework.d.ts.map +1 -1
  137. package/dist/learning/eval-framework.js +6 -2
  138. package/dist/learning/eval-framework.js.map +1 -1
  139. package/dist/learning/failure-bookkeeping.d.ts +19 -0
  140. package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
  141. package/dist/learning/failure-bookkeeping.js +67 -2
  142. package/dist/learning/failure-bookkeeping.js.map +1 -1
  143. package/dist/learning/feedback.d.ts.map +1 -1
  144. package/dist/learning/feedback.js +19 -8
  145. package/dist/learning/feedback.js.map +1 -1
  146. package/dist/learning/model-harness.d.ts +76 -0
  147. package/dist/learning/model-harness.d.ts.map +1 -0
  148. package/dist/learning/model-harness.js +119 -0
  149. package/dist/learning/model-harness.js.map +1 -0
  150. package/dist/learning/model-selection.d.ts +15 -0
  151. package/dist/learning/model-selection.d.ts.map +1 -1
  152. package/dist/learning/model-selection.js +27 -1
  153. package/dist/learning/model-selection.js.map +1 -1
  154. package/dist/learning/provider-fallback.d.ts +12 -0
  155. package/dist/learning/provider-fallback.d.ts.map +1 -1
  156. package/dist/learning/provider-fallback.js +74 -0
  157. package/dist/learning/provider-fallback.js.map +1 -1
  158. package/dist/learning/provider-revival.d.ts +106 -0
  159. package/dist/learning/provider-revival.d.ts.map +1 -0
  160. package/dist/learning/provider-revival.js +154 -0
  161. package/dist/learning/provider-revival.js.map +1 -0
  162. package/dist/learning/resilient-call.d.ts.map +1 -1
  163. package/dist/learning/resilient-call.js +48 -3
  164. package/dist/learning/resilient-call.js.map +1 -1
  165. package/dist/nlu/conversation-gate.d.ts +37 -0
  166. package/dist/nlu/conversation-gate.d.ts.map +1 -1
  167. package/dist/nlu/conversation-gate.js +49 -0
  168. package/dist/nlu/conversation-gate.js.map +1 -1
  169. package/dist/nlu/schema.d.ts +2 -2
  170. package/dist/observability/dag-bridge.d.ts +69 -0
  171. package/dist/observability/dag-bridge.d.ts.map +1 -0
  172. package/dist/observability/dag-bridge.js +56 -0
  173. package/dist/observability/dag-bridge.js.map +1 -0
  174. package/dist/observability/event-bus.d.ts +5 -10
  175. package/dist/observability/event-bus.d.ts.map +1 -1
  176. package/dist/observability/event-bus.js +10 -42
  177. package/dist/observability/event-bus.js.map +1 -1
  178. package/dist/skills/execution-audit.d.ts.map +1 -1
  179. package/dist/skills/execution-audit.js +17 -5
  180. package/dist/skills/execution-audit.js.map +1 -1
  181. package/dist/skills/sandbox-executor.d.ts +12 -1
  182. package/dist/skills/sandbox-executor.d.ts.map +1 -1
  183. package/dist/skills/sandbox-executor.js +28 -6
  184. package/dist/skills/sandbox-executor.js.map +1 -1
  185. package/dist/skills/secret-capture.d.ts +45 -1
  186. package/dist/skills/secret-capture.d.ts.map +1 -1
  187. package/dist/skills/secret-capture.js +82 -19
  188. package/dist/skills/secret-capture.js.map +1 -1
  189. package/dist/skills/skill-env-inventory.d.ts +79 -0
  190. package/dist/skills/skill-env-inventory.d.ts.map +1 -0
  191. package/dist/skills/skill-env-inventory.js +167 -0
  192. package/dist/skills/skill-env-inventory.js.map +1 -0
  193. package/dist/skills/skill-executor.d.ts +2 -0
  194. package/dist/skills/skill-executor.d.ts.map +1 -1
  195. package/dist/skills/skill-executor.js +19 -24
  196. package/dist/skills/skill-executor.js.map +1 -1
  197. package/dist/tools/ask-user.d.ts +14 -1
  198. package/dist/tools/ask-user.d.ts.map +1 -1
  199. package/dist/tools/ask-user.js +25 -1
  200. package/dist/tools/ask-user.js.map +1 -1
  201. package/dist/tools/followup-utils.d.ts +64 -0
  202. package/dist/tools/followup-utils.d.ts.map +1 -0
  203. package/dist/tools/followup-utils.js +158 -0
  204. package/dist/tools/followup-utils.js.map +1 -0
  205. package/dist/tools/memory-tools.d.ts +35 -0
  206. package/dist/tools/memory-tools.d.ts.map +1 -1
  207. package/dist/tools/memory-tools.js +76 -0
  208. package/dist/tools/memory-tools.js.map +1 -1
  209. package/dist/tools/pipeline-tool.d.ts.map +1 -1
  210. package/dist/tools/pipeline-tool.js +8 -3
  211. package/dist/tools/pipeline-tool.js.map +1 -1
  212. package/dist/tools/registry.d.ts +25 -12
  213. package/dist/tools/registry.d.ts.map +1 -1
  214. package/dist/tools/registry.js +31 -6
  215. package/dist/tools/registry.js.map +1 -1
  216. package/dist/tools/skill-tool.d.ts.map +1 -1
  217. package/dist/tools/skill-tool.js +52 -5
  218. package/dist/tools/skill-tool.js.map +1 -1
  219. package/dist/tools/tool-loop.d.ts +63 -1
  220. package/dist/tools/tool-loop.d.ts.map +1 -1
  221. package/dist/tools/tool-loop.js +305 -66
  222. package/dist/tools/tool-loop.js.map +1 -1
  223. package/dist/tools/toolsets.d.ts +19 -3
  224. package/dist/tools/toolsets.d.ts.map +1 -1
  225. package/dist/tools/toolsets.js +21 -5
  226. package/dist/tools/toolsets.js.map +1 -1
  227. package/dist/utils/env.d.ts.map +1 -1
  228. package/dist/utils/env.js +9 -13
  229. package/dist/utils/env.js.map +1 -1
  230. package/dist/web-dashboard/chat-console.d.ts +13 -1
  231. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  232. package/dist/web-dashboard/chat-console.js +16 -2
  233. package/dist/web-dashboard/chat-console.js.map +1 -1
  234. package/dist/web-dashboard/hub-data.d.ts +2 -0
  235. package/dist/web-dashboard/hub-data.d.ts.map +1 -1
  236. package/dist/web-dashboard/hub-data.js +4 -0
  237. package/dist/web-dashboard/hub-data.js.map +1 -1
  238. package/dist/web-dashboard/server.d.ts +6 -0
  239. package/dist/web-dashboard/server.d.ts.map +1 -1
  240. package/dist/web-dashboard/server.js +192 -3
  241. package/dist/web-dashboard/server.js.map +1 -1
  242. package/dist/web-dashboard/src/types.d.ts +31 -1
  243. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  244. package/package.json +11 -1
  245. package/src/web-dashboard/public/assets/index-56yPnN_m.js +207 -0
  246. package/src/web-dashboard/public/assets/index-56yPnN_m.js.map +1 -0
  247. package/src/web-dashboard/public/assets/{index-C507EUWf.css → index-Cyd6tIew.css} +1 -1
  248. package/src/web-dashboard/public/index.html +2 -2
  249. package/dist/example.d.ts +0 -1
  250. package/dist/example.d.ts.map +0 -1
  251. package/dist/example.js +0 -3
  252. package/dist/example.js.map +0 -1
  253. package/dist/fresh.d.ts +0 -2
  254. package/dist/fresh.d.ts.map +0 -1
  255. package/dist/fresh.js +0 -2
  256. package/dist/fresh.js.map +0 -1
  257. package/dist/mcp/mcp-dashboard-oauth.d.ts +0 -94
  258. package/dist/mcp/mcp-dashboard-oauth.d.ts.map +0 -1
  259. package/dist/mcp/mcp-dashboard-oauth.js +0 -140
  260. package/dist/mcp/mcp-dashboard-oauth.js.map +0 -1
  261. package/dist/memory/background-sync.d.ts +0 -107
  262. package/dist/memory/background-sync.d.ts.map +0 -1
  263. package/dist/memory/background-sync.js +0 -242
  264. package/dist/memory/background-sync.js.map +0 -1
  265. package/dist/memory/cross-session.d.ts +0 -68
  266. package/dist/memory/cross-session.d.ts.map +0 -1
  267. package/dist/memory/cross-session.js +0 -153
  268. package/dist/memory/cross-session.js.map +0 -1
  269. package/dist/memory/drift-detector.d.ts +0 -76
  270. package/dist/memory/drift-detector.d.ts.map +0 -1
  271. package/dist/memory/drift-detector.js +0 -216
  272. package/dist/memory/drift-detector.js.map +0 -1
  273. package/dist/memory/enhanced-manager.d.ts +0 -105
  274. package/dist/memory/enhanced-manager.d.ts.map +0 -1
  275. package/dist/memory/enhanced-manager.js +0 -280
  276. package/dist/memory/enhanced-manager.js.map +0 -1
  277. package/dist/memory/session-extraction.d.ts +0 -93
  278. package/dist/memory/session-extraction.d.ts.map +0 -1
  279. package/dist/memory/session-extraction.js +0 -290
  280. package/dist/memory/session-extraction.js.map +0 -1
  281. package/dist/memory/sqlite-store.d.ts +0 -208
  282. package/dist/memory/sqlite-store.d.ts.map +0 -1
  283. package/dist/memory/sqlite-store.js +0 -556
  284. package/dist/memory/sqlite-store.js.map +0 -1
  285. package/dist/skills/daytona-executor.d.ts +0 -78
  286. package/dist/skills/daytona-executor.d.ts.map +0 -1
  287. package/dist/skills/daytona-executor.js +0 -256
  288. package/dist/skills/daytona-executor.js.map +0 -1
  289. package/dist/skills/modal-executor.d.ts +0 -81
  290. package/dist/skills/modal-executor.d.ts.map +0 -1
  291. package/dist/skills/modal-executor.js +0 -285
  292. package/dist/skills/modal-executor.js.map +0 -1
  293. package/dist/sync/inventory.d.ts +0 -1
  294. package/dist/sync/inventory.d.ts.map +0 -1
  295. package/dist/sync/inventory.js +0 -3
  296. package/dist/sync/inventory.js.map +0 -1
  297. package/dist/sync/validate.d.ts +0 -1
  298. package/dist/sync/validate.d.ts.map +0 -1
  299. package/dist/sync/validate.js +0 -3
  300. package/dist/sync/validate.js.map +0 -1
  301. package/dist/test.d.ts +0 -2
  302. package/dist/test.d.ts.map +0 -1
  303. package/dist/test.js +0 -3
  304. package/dist/test.js.map +0 -1
  305. package/dist/tools/browser-tool.d.ts +0 -206
  306. package/dist/tools/browser-tool.d.ts.map +0 -1
  307. package/dist/tools/browser-tool.js +0 -726
  308. package/dist/tools/browser-tool.js.map +0 -1
  309. package/dist/tools/delegate-tool.d.ts +0 -109
  310. package/dist/tools/delegate-tool.d.ts.map +0 -1
  311. package/dist/tools/delegate-tool.js +0 -185
  312. package/dist/tools/delegate-tool.js.map +0 -1
  313. package/dist/tools/delegation-state.d.ts +0 -87
  314. package/dist/tools/delegation-state.d.ts.map +0 -1
  315. package/dist/tools/delegation-state.js +0 -278
  316. package/dist/tools/delegation-state.js.map +0 -1
  317. package/dist/tools/desktop-ui.d.ts +0 -148
  318. package/dist/tools/desktop-ui.d.ts.map +0 -1
  319. package/dist/tools/desktop-ui.js +0 -486
  320. package/dist/tools/desktop-ui.js.map +0 -1
  321. package/dist/tools/image-video-tool.d.ts +0 -88
  322. package/dist/tools/image-video-tool.d.ts.map +0 -1
  323. package/dist/tools/image-video-tool.js +0 -276
  324. package/dist/tools/image-video-tool.js.map +0 -1
  325. package/dist/tools/kanban-cron-tools.d.ts +0 -92
  326. package/dist/tools/kanban-cron-tools.d.ts.map +0 -1
  327. package/dist/tools/kanban-cron-tools.js +0 -197
  328. package/dist/tools/kanban-cron-tools.js.map +0 -1
  329. package/dist/tools/messaging-tool.d.ts +0 -127
  330. package/dist/tools/messaging-tool.d.ts.map +0 -1
  331. package/dist/tools/messaging-tool.js +0 -314
  332. package/dist/tools/messaging-tool.js.map +0 -1
  333. package/dist/tools/modality/generic-caller.d.ts +0 -43
  334. package/dist/tools/modality/generic-caller.d.ts.map +0 -1
  335. package/dist/tools/modality/generic-caller.js +0 -254
  336. package/dist/tools/modality/generic-caller.js.map +0 -1
  337. package/dist/tools/modality/modality-catalog.d.ts +0 -134
  338. package/dist/tools/modality/modality-catalog.d.ts.map +0 -1
  339. package/dist/tools/modality/modality-catalog.js +0 -445
  340. package/dist/tools/modality/modality-catalog.js.map +0 -1
  341. package/dist/tools/modality/tool-router.d.ts +0 -81
  342. package/dist/tools/modality/tool-router.d.ts.map +0 -1
  343. package/dist/tools/modality/tool-router.js +0 -84
  344. package/dist/tools/modality/tool-router.js.map +0 -1
  345. package/dist/tools/security-tools.d.ts +0 -107
  346. package/dist/tools/security-tools.d.ts.map +0 -1
  347. package/dist/tools/security-tools.js +0 -264
  348. package/dist/tools/security-tools.js.map +0 -1
  349. package/dist/tools/ssh-tool.d.ts +0 -130
  350. package/dist/tools/ssh-tool.d.ts.map +0 -1
  351. package/dist/tools/ssh-tool.js +0 -328
  352. package/dist/tools/ssh-tool.js.map +0 -1
  353. package/dist/tools/tts-tool.d.ts +0 -91
  354. package/dist/tools/tts-tool.d.ts.map +0 -1
  355. package/dist/tools/tts-tool.js +0 -406
  356. package/dist/tools/tts-tool.js.map +0 -1
  357. package/dist/utils/shell-detection.d.ts +0 -124
  358. package/dist/utils/shell-detection.d.ts.map +0 -1
  359. package/dist/utils/shell-detection.js +0 -305
  360. package/dist/utils/shell-detection.js.map +0 -1
  361. package/dist/utils/windows-paths.d.ts +0 -185
  362. package/dist/utils/windows-paths.d.ts.map +0 -1
  363. package/dist/utils/windows-paths.js +0 -472
  364. package/dist/utils/windows-paths.js.map +0 -1
  365. package/src/web-dashboard/public/assets/index-C4frng1Q.js +0 -207
  366. package/src/web-dashboard/public/assets/index-C4frng1Q.js.map +0 -1
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Gateway liveness heartbeat (`src/gateway/heartbeat.ts`).
3
+ *
4
+ * The gateway is a FOREGROUND process. When it dies — laptop slept, terminal
5
+ * closed, the harness killed the process group — nothing else notices: the
6
+ * adapters stop receiving, `gateway status` still lists every platform as
7
+ * "configured ✅" (that only reflects env vars), and senders keep messaging a
8
+ * bridge nobody is listening to. Observed live: no gateway process existed at
9
+ * all while the dashboard happily reported the channels as set up.
10
+ *
11
+ * This module makes that state VISIBLE and, with `--supervise`, self-healing:
12
+ *
13
+ * - the running gateway writes `~/.nuvira/gateway/heartbeat.json` every
14
+ * `HEARTBEAT_INTERVAL_MS` with its pid, uptime, adapter health and the
15
+ * supervisor's pid;
16
+ * - `gateway status` reads it and reports `running` / `stale` / `down` — so the
17
+ * answer to "is my gateway up?" is never a guess;
18
+ * - the heartbeat is the supervisor's liveness signal too (a supervisor that
19
+ * sees a stale child can restart it).
20
+ *
21
+ * Writes are best-effort: a failure to record liveness must never take the
22
+ * gateway down with it.
23
+ */
24
+ /** How often the running gateway writes a beat (ms). */
25
+ export declare const HEARTBEAT_INTERVAL_MS = 15000;
26
+ /**
27
+ * A beat older than this means the process is gone (3 missed beats). Chosen
28
+ * comfortably above the interval so a slow tick never reads as a death.
29
+ */
30
+ export declare const HEARTBEAT_STALE_AFTER_MS: number;
31
+ /** Health of one adapter as reported in a beat. */
32
+ export interface AdapterHealth {
33
+ platform: string;
34
+ configured: boolean;
35
+ /** Whether `start()` succeeded (and has not been declared dead since). */
36
+ started: boolean;
37
+ /** Restart attempts made so far this run. */
38
+ restarts: number;
39
+ /** Last failure message, when the adapter is not started. */
40
+ lastError?: string;
41
+ }
42
+ /** The on-disk beat. */
43
+ export interface HeartbeatFile {
44
+ version: 1;
45
+ /** The gateway process's pid. */
46
+ pid: number;
47
+ /** Epoch ms the gateway started. */
48
+ startedAt: number;
49
+ /** Epoch ms of this beat (the liveness timestamp). */
50
+ at: number;
51
+ /** How many beats have been written this run. */
52
+ beats: number;
53
+ /** True when a `gateway start --supervise` parent owns this process. */
54
+ supervised: boolean;
55
+ /** The supervisor's pid, when supervised. */
56
+ supervisorPid?: number;
57
+ /** Adapter health at beat time. */
58
+ adapters: AdapterHealth[];
59
+ }
60
+ /** Liveness verdict for `gateway status`. */
61
+ export type GatewayLiveness = 'running' | 'stale' | 'down';
62
+ /** The verdict + the beat behind it. */
63
+ export interface HeartbeatStatus {
64
+ state: GatewayLiveness;
65
+ /** Age of the last beat in ms (Infinity-ish large when there is no beat). */
66
+ ageMs: number;
67
+ beat: HeartbeatFile | null;
68
+ /** The heartbeat file path (always reported so an operator can inspect it). */
69
+ path: string;
70
+ }
71
+ /** Read/write the gateway heartbeat file. */
72
+ export declare class GatewayHeartbeat {
73
+ private file;
74
+ constructor(configDir?: string);
75
+ /** Absolute path of the heartbeat file. */
76
+ get beatPath(): string;
77
+ /** The last beat, or null when there is none / it is unreadable. */
78
+ read(): HeartbeatFile | null;
79
+ /**
80
+ * Classify liveness. `running` only when a beat exists AND is fresh — a
81
+ * beat file left behind by a crashed process must read as `down`, never as
82
+ * "configured and fine" (that was the silent failure).
83
+ */
84
+ status(now?: number): HeartbeatStatus;
85
+ /** Write a beat. Never throws (liveness bookkeeping must not kill the gateway). */
86
+ beat(input: {
87
+ pid?: number;
88
+ startedAt: number;
89
+ beats: number;
90
+ supervised: boolean;
91
+ supervisorPid?: number;
92
+ adapters: AdapterHealth[];
93
+ }): HeartbeatFile | null;
94
+ /** Remove the beat on a clean shutdown (so `status` says "down", not "stale"). */
95
+ clear(): void;
96
+ }
97
+ /** Human-readable age ("3s", "4m", "2h 7m"). */
98
+ export declare function formatDuration(ms: number): string;
99
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/gateway/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAA4B,CAAC;AAElE,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAwB;AACxB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,6CAA6C;AAC7C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAS;gBAET,SAAS,CAAC,EAAE,MAAM;IAI9B,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oEAAoE;IACpE,IAAI,IAAI,aAAa,GAAG,IAAI;IAW5B;;;;OAIG;IACH,MAAM,CAAC,GAAG,SAAa,GAAG,eAAe;IAYzC,mFAAmF;IACnF,IAAI,CAAC,KAAK,EAAE;QACV,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;KAC3B,GAAG,aAAa,GAAG,IAAI;IAoBxB,kFAAkF;IAClF,KAAK,IAAI,IAAI;CAOd;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASjD"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Gateway liveness heartbeat (`src/gateway/heartbeat.ts`).
3
+ *
4
+ * The gateway is a FOREGROUND process. When it dies — laptop slept, terminal
5
+ * closed, the harness killed the process group — nothing else notices: the
6
+ * adapters stop receiving, `gateway status` still lists every platform as
7
+ * "configured ✅" (that only reflects env vars), and senders keep messaging a
8
+ * bridge nobody is listening to. Observed live: no gateway process existed at
9
+ * all while the dashboard happily reported the channels as set up.
10
+ *
11
+ * This module makes that state VISIBLE and, with `--supervise`, self-healing:
12
+ *
13
+ * - the running gateway writes `~/.nuvira/gateway/heartbeat.json` every
14
+ * `HEARTBEAT_INTERVAL_MS` with its pid, uptime, adapter health and the
15
+ * supervisor's pid;
16
+ * - `gateway status` reads it and reports `running` / `stale` / `down` — so the
17
+ * answer to "is my gateway up?" is never a guess;
18
+ * - the heartbeat is the supervisor's liveness signal too (a supervisor that
19
+ * sees a stale child can restart it).
20
+ *
21
+ * Writes are best-effort: a failure to record liveness must never take the
22
+ * gateway down with it.
23
+ */
24
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
25
+ import { dirname, join } from 'node:path';
26
+ import { resolveBuffConfigDir } from '../config/paths.js';
27
+ /** How often the running gateway writes a beat (ms). */
28
+ export const HEARTBEAT_INTERVAL_MS = 15_000;
29
+ /**
30
+ * A beat older than this means the process is gone (3 missed beats). Chosen
31
+ * comfortably above the interval so a slow tick never reads as a death.
32
+ */
33
+ export const HEARTBEAT_STALE_AFTER_MS = 3 * HEARTBEAT_INTERVAL_MS;
34
+ /** Read/write the gateway heartbeat file. */
35
+ export class GatewayHeartbeat {
36
+ file;
37
+ constructor(configDir) {
38
+ this.file = join(resolveBuffConfigDir(configDir), 'gateway', 'heartbeat.json');
39
+ }
40
+ /** Absolute path of the heartbeat file. */
41
+ get beatPath() {
42
+ return this.file;
43
+ }
44
+ /** The last beat, or null when there is none / it is unreadable. */
45
+ read() {
46
+ try {
47
+ if (!existsSync(this.file))
48
+ return null;
49
+ const parsed = JSON.parse(readFileSync(this.file, 'utf-8'));
50
+ if (!parsed || typeof parsed.at !== 'number' || typeof parsed.pid !== 'number')
51
+ return null;
52
+ return parsed;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Classify liveness. `running` only when a beat exists AND is fresh — a
60
+ * beat file left behind by a crashed process must read as `down`, never as
61
+ * "configured and fine" (that was the silent failure).
62
+ */
63
+ status(now = Date.now()) {
64
+ const beat = this.read();
65
+ if (!beat)
66
+ return { state: 'down', ageMs: Number.POSITIVE_INFINITY, beat: null, path: this.file };
67
+ const ageMs = Math.max(0, now - beat.at);
68
+ return {
69
+ state: ageMs <= HEARTBEAT_STALE_AFTER_MS ? 'running' : 'stale',
70
+ ageMs,
71
+ beat,
72
+ path: this.file,
73
+ };
74
+ }
75
+ /** Write a beat. Never throws (liveness bookkeeping must not kill the gateway). */
76
+ beat(input) {
77
+ const record = {
78
+ version: 1,
79
+ pid: input.pid ?? process.pid,
80
+ startedAt: input.startedAt,
81
+ at: Date.now(),
82
+ beats: input.beats,
83
+ supervised: input.supervised,
84
+ supervisorPid: input.supervisorPid,
85
+ adapters: input.adapters,
86
+ };
87
+ try {
88
+ mkdirSync(dirname(this.file), { recursive: true });
89
+ writeFileSync(this.file, JSON.stringify(record, null, 2), 'utf-8');
90
+ return record;
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ /** Remove the beat on a clean shutdown (so `status` says "down", not "stale"). */
97
+ clear() {
98
+ try {
99
+ if (existsSync(this.file))
100
+ unlinkSync(this.file);
101
+ }
102
+ catch {
103
+ /* best-effort */
104
+ }
105
+ }
106
+ }
107
+ /** Human-readable age ("3s", "4m", "2h 7m"). */
108
+ export function formatDuration(ms) {
109
+ if (!Number.isFinite(ms))
110
+ return 'never';
111
+ const s = Math.floor(ms / 1000);
112
+ if (s < 60)
113
+ return `${s}s`;
114
+ const m = Math.floor(s / 60);
115
+ if (m < 60)
116
+ return `${m}m ${s % 60}s`;
117
+ const h = Math.floor(m / 60);
118
+ if (h < 24)
119
+ return `${h}h ${m % 60}m`;
120
+ return `${Math.floor(h / 24)}d ${h % 24}h`;
121
+ }
122
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/gateway/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,13 @@
9
9
  * the delivery ledger.
10
10
  */
11
11
  /** How an inbound message was handled by the registry. */
12
- export type InboundDisposition = 'pipeline' | 'chat' | 'help' | 'refused' | 'error';
12
+ export type InboundDisposition = 'pipeline' | 'chat' | 'help' | 'refused' | 'error'
13
+ /**
14
+ * A re-delivery of a message already handled (bridge reconnect, offline
15
+ * backfill, webhook retry). Recorded for visibility, but NOT processed and
16
+ * NOT answered — the sender already has the answer.
17
+ */
18
+ | 'duplicate';
13
19
  /** One inbound message recorded by the gateway. */
14
20
  export interface InboxEntry {
15
21
  id: string;
@@ -24,6 +30,13 @@ export interface InboxEntry {
24
30
  isGroup?: boolean;
25
31
  /** What the gateway did with it. */
26
32
  handled: InboundDisposition;
33
+ /**
34
+ * Present on a `duplicate` entry: the id/fingerprint it collided with, so an
35
+ * operator can see WHY it was dropped rather than guessing.
36
+ */
37
+ dedupKey?: string;
38
+ /** For a `duplicate`: how many times this identity has now been seen. */
39
+ dedupCount?: number;
27
40
  /** The reply text sent back (when any). */
28
41
  reply?: string;
29
42
  /** When the message was received (epoch ms). */
@@ -1 +1 @@
1
- {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpF,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,QAA0B,CAAC;AAE1D,oCAAoC;AACpC,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,SAAS,CAAC,EAAE,MAAM;IAI9B,wCAAwC;IACxC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,qDAAqD;IACrD,IAAI,IAAI,UAAU,EAAE;IAUpB,OAAO,CAAC,KAAK;IASb,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,UAAU;CAQzD"}
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO;AACT;;;;GAIG;GACD,WAAW,CAAC;AAEhB,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,QAA0B,CAAC;AAE1D,oCAAoC;AACpC,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,SAAS,CAAC,EAAE,MAAM;IAI9B,wCAAwC;IACxC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,qDAAqD;IACrD,IAAI,IAAI,UAAU,EAAE;IAUpB,OAAO,CAAC,KAAK;IASb,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,UAAU;CAQzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAyB1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D,oCAAoC;AACpC,MAAM,OAAO,WAAW;IACd,IAAI,CAAS;IAErB,YAAY,SAAkB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,qDAAqD;IACrD,IAAI;QACF,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAA+B,CAAC;YAC1F,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAqB;QACjC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAoC;QACzC,MAAM,KAAK,GAAe,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,uEAAuE;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AA2C1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D,oCAAoC;AACpC,MAAM,OAAO,WAAW;IACd,IAAI,CAAS;IAErB,YAAY,SAAkB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,qDAAqD;IACrD,IAAI;QACF,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAA+B,CAAC;YAC1F,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAqB;QACjC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAoC;QACzC,MAAM,KAAK,GAAe,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,uEAAuE;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -24,6 +24,11 @@ export interface PlatformEnvVarMeta {
24
24
  export declare function platformEnvVarMeta(platform: Platform): PlatformEnvVarMeta[];
25
25
  /** Platforms manageable through the config surface (excludes whatsapp/mock). */
26
26
  export declare function configurablePlatforms(): Platform[];
27
+ /**
28
+ * The `.env` that holds platform credentials. Delegates to the shared resolver
29
+ * so writes land in the ACTIVE config dir (`NUVIRA_CONFIG_DIR` aware) and never
30
+ * mutate the real profile's credential file from an isolated process.
31
+ */
27
32
  export declare function envFilePath(): string;
28
33
  export interface EnvVarState {
29
34
  varName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE3F,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;CACjB;AAkCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAM3E;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,QAAQ,EAAE,CAIlD;AAID,wBAAgB,WAAW,IAAI,MAAM,CAQpC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAIxD;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,oBAAoB,CAW7E;AAkCD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,GAAE,MAAM,EAAO,GACrB;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmCxC;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,IAAI,CAO/F;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
1
+ {"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE3F,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;CACjB;AAkCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAM3E;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,QAAQ,EAAE,CAIlD;AAID;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAIxD;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,oBAAoB,CAW7E;AAkCD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,GAAE,MAAM,EAAO,GACrB;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmCxC;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,IAAI,CAO/F;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
@@ -13,9 +13,7 @@
13
13
  * pair` / the WhatsApp panel — not an env token.
14
14
  */
15
15
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
16
- import { envBuff, resolveNuviraHome } from '../config/paths.js';
17
- import { join } from 'node:path';
18
- import { homedir } from 'node:os';
16
+ import { resolveNuviraEnvFile } from '../config/paths.js';
19
17
  import { PLATFORM_ENV_VARS, PLATFORM_LABELS } from './channel-directory.js';
20
18
  const SECRET_HINT = /TOKEN|PASSWORD|PASS|SECRET|KEY|AUTH|CRED/i;
21
19
  const PROMPTS = {
@@ -58,17 +56,14 @@ export function platformEnvVarMeta(platform) {
58
56
  export function configurablePlatforms() {
59
57
  return Object.keys(PLATFORM_ENV_VARS).filter((p) => p !== 'whatsapp' && p !== 'mock');
60
58
  }
61
- // ─── ~/.nuvira/.env read/write (line-preserving merge) ────────────────────────
59
+ // ─── Credential .env read/write (line-preserving merge) ──────────────────────
60
+ /**
61
+ * The `.env` that holds platform credentials. Delegates to the shared resolver
62
+ * so writes land in the ACTIVE config dir (`NUVIRA_CONFIG_DIR` aware) and never
63
+ * mutate the real profile's credential file from an isolated process.
64
+ */
62
65
  export function envFilePath() {
63
- if (process.env.NUVIRA_ENV_FILE && process.env.NUVIRA_ENV_FILE.trim().length > 0)
64
- return process.env.NUVIRA_ENV_FILE;
65
- const override = envBuff('ENV_FILE');
66
- if (override && override.trim().length > 0)
67
- return override;
68
- const nuviraEnv = join(homedir(), '.nuvira', '.env');
69
- if (existsSync(nuviraEnv))
70
- return nuviraEnv;
71
- return join(resolveNuviraHome(), '.env');
66
+ return resolveNuviraEnvFile();
72
67
  }
73
68
  /** Per-var current state — env file first, then process.env (file wins like loadEnv). */
74
69
  export function envVarState(varName) {
@@ -1 +1 @@
1
- {"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ import { ChannelDirectory, type ChannelRef, type PolicyMap } from './channel-dir
20
20
  import type { ChannelAdapter, InboundMessage, MediaPayload } from './adapters.js';
21
21
  import { DeliveryLedger } from './delivery.js';
22
22
  import { InboxLedger } from './inbox.js';
23
+ import { InboundDedupLedger } from './dedup.js';
24
+ import { GatewayHeartbeat } from './heartbeat.js';
23
25
  /**
24
26
  * Strip leaked internal reasoning, planning blocks, and meta-commentary from
25
27
  * a gateway chat response. The model sometimes emits its chain-of-thought
@@ -115,6 +117,18 @@ export declare class GatewayRegistry {
115
117
  readonly delivery: DeliveryLedger;
116
118
  /** P2 — inbound message inbox (who messaged the bot, what happened). */
117
119
  readonly inbox: InboxLedger;
120
+ /**
121
+ * Idempotency ledger: a message delivered twice (bridge reconnect, offline
122
+ * backfill, webhook retry) is handled once. Without it, one WhatsApp ask
123
+ * became 20+ identical model turns — see dedup.ts.
124
+ */
125
+ readonly dedup: InboundDedupLedger;
126
+ /**
127
+ * Liveness beat — so a gateway that is DOWN is visibly down instead of
128
+ * "configured ✅ but nobody home". Read by `gateway status` and the
129
+ * supervisor.
130
+ */
131
+ readonly heartbeat: GatewayHeartbeat;
118
132
  private adapters;
119
133
  private configManager;
120
134
  private options;
@@ -134,10 +148,27 @@ export declare class GatewayRegistry {
134
148
  * double-count would prematurely fail entries). */
135
149
  private drainChain;
136
150
  private started;
151
+ /** Epoch ms of start() — the uptime reported in the heartbeat. */
152
+ private startedAt;
153
+ /** Beats written this run (monotonic; a stalled count means a stalled loop). */
154
+ private beatCount;
155
+ /** Per-adapter health, published in every beat. */
156
+ private adapterHealth;
157
+ /** Earliest epoch-ms at which a not-yet-started adapter may be retried. */
158
+ private adapterRetryAt;
159
+ /** The heartbeat + watchdog tick. */
160
+ private livenessTimer;
137
161
  private chatEngine;
138
162
  /** Per-contact conversation history for gateway chat (WhatsApp/Telegram/etc.).
139
163
  * Disk-backed via GatewayChatStore so history survives gateway restarts. */
140
164
  private chatStore;
165
+ /**
166
+ * P5 — the followups last offered to each contact (`platform:channelId`).
167
+ * A messaging-app sender has no clickable chips: they REPLY with one of the
168
+ * rendered lines, so this is the only way to know the message is a follow-up
169
+ * to the previous answer rather than a brand-new independent request.
170
+ */
171
+ private lastFollowupsByContact;
141
172
  private onTypingCallback;
142
173
  constructor(options?: GatewayRegistryOptions, configManager?: ConfigManager);
143
174
  /**
@@ -242,6 +273,22 @@ export declare class GatewayRegistry {
242
273
  * display name.
243
274
  */
244
275
  private learnTelegramChatId;
276
+ /**
277
+ * Start ONE adapter and record its health. Never throws: a platform that
278
+ * fails to start must not take the gateway down with it.
279
+ */
280
+ private startAdapter;
281
+ /** Max restart attempts per adapter per run — beyond this, stop the churn. */
282
+ private static readonly ADAPTER_MAX_RESTARTS;
283
+ /** Exponential backoff between adapter restart attempts (5s → 120s). */
284
+ private scheduleAdapterRetry;
285
+ /**
286
+ * The liveness tick: retry dead adapters, then write a beat. Runs on the
287
+ * same interval for both, so a stalled process is visible as a stalled beat.
288
+ */
289
+ private startLiveness;
290
+ /** Retry every configured adapter that is not currently started. */
291
+ private retryPendingAdapters;
245
292
  /** Stop adapters + unsubscribe + stop the delivery drain. Idempotent. */
246
293
  stop(): Promise<void>;
247
294
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/gateway/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/gateway/registry.ts"],"names":[],"mappings":"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"}