@yoda.digital/iris-gateway 1.13.3

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 (596) hide show
  1. package/CHANGELOG.md +515 -0
  2. package/README.md +282 -0
  3. package/dist/auto-reply/engine.d.ts +13 -0
  4. package/dist/auto-reply/engine.d.ts.map +1 -0
  5. package/dist/auto-reply/engine.js +70 -0
  6. package/dist/auto-reply/engine.js.map +1 -0
  7. package/dist/auto-reply/types.d.ts +37 -0
  8. package/dist/auto-reply/types.d.ts.map +1 -0
  9. package/dist/auto-reply/types.js +2 -0
  10. package/dist/auto-reply/types.js.map +1 -0
  11. package/dist/bridge/circuit-breaker.d.ts +40 -0
  12. package/dist/bridge/circuit-breaker.d.ts.map +1 -0
  13. package/dist/bridge/circuit-breaker.js +82 -0
  14. package/dist/bridge/circuit-breaker.js.map +1 -0
  15. package/dist/bridge/event-handler.d.ts +18 -0
  16. package/dist/bridge/event-handler.d.ts.map +1 -0
  17. package/dist/bridge/event-handler.js +128 -0
  18. package/dist/bridge/event-handler.js.map +1 -0
  19. package/dist/bridge/message-queue.d.ts +50 -0
  20. package/dist/bridge/message-queue.d.ts.map +1 -0
  21. package/dist/bridge/message-queue.js +110 -0
  22. package/dist/bridge/message-queue.js.map +1 -0
  23. package/dist/bridge/message-router.d.ts +37 -0
  24. package/dist/bridge/message-router.d.ts.map +1 -0
  25. package/dist/bridge/message-router.js +329 -0
  26. package/dist/bridge/message-router.js.map +1 -0
  27. package/dist/bridge/opencode-client.d.ts +55 -0
  28. package/dist/bridge/opencode-client.d.ts.map +1 -0
  29. package/dist/bridge/opencode-client.js +282 -0
  30. package/dist/bridge/opencode-client.js.map +1 -0
  31. package/dist/bridge/routers/channels.d.ts +11 -0
  32. package/dist/bridge/routers/channels.d.ts.map +1 -0
  33. package/dist/bridge/routers/channels.js +164 -0
  34. package/dist/bridge/routers/channels.js.map +1 -0
  35. package/dist/bridge/routers/cli.d.ts +11 -0
  36. package/dist/bridge/routers/cli.d.ts.map +1 -0
  37. package/dist/bridge/routers/cli.js +31 -0
  38. package/dist/bridge/routers/cli.js.map +1 -0
  39. package/dist/bridge/routers/governance.d.ts +13 -0
  40. package/dist/bridge/routers/governance.d.ts.map +1 -0
  41. package/dist/bridge/routers/governance.js +115 -0
  42. package/dist/bridge/routers/governance.js.map +1 -0
  43. package/dist/bridge/routers/intelligence.d.ts +23 -0
  44. package/dist/bridge/routers/intelligence.d.ts.map +1 -0
  45. package/dist/bridge/routers/intelligence.js +165 -0
  46. package/dist/bridge/routers/intelligence.js.map +1 -0
  47. package/dist/bridge/routers/skills-handlers.d.ts +122 -0
  48. package/dist/bridge/routers/skills-handlers.d.ts.map +1 -0
  49. package/dist/bridge/routers/skills-handlers.js +396 -0
  50. package/dist/bridge/routers/skills-handlers.js.map +1 -0
  51. package/dist/bridge/routers/skills-router.d.ts +5 -0
  52. package/dist/bridge/routers/skills-router.d.ts.map +1 -0
  53. package/dist/bridge/routers/skills-router.js +22 -0
  54. package/dist/bridge/routers/skills-router.js.map +1 -0
  55. package/dist/bridge/routers/skills.d.ts +2 -0
  56. package/dist/bridge/routers/skills.d.ts.map +1 -0
  57. package/dist/bridge/routers/skills.js +4 -0
  58. package/dist/bridge/routers/skills.js.map +1 -0
  59. package/dist/bridge/routers/system.d.ts +29 -0
  60. package/dist/bridge/routers/system.d.ts.map +1 -0
  61. package/dist/bridge/routers/system.js +132 -0
  62. package/dist/bridge/routers/system.js.map +1 -0
  63. package/dist/bridge/routers/vault.d.ts +11 -0
  64. package/dist/bridge/routers/vault.d.ts.map +1 -0
  65. package/dist/bridge/routers/vault.js +97 -0
  66. package/dist/bridge/routers/vault.js.map +1 -0
  67. package/dist/bridge/session-map.d.ts +24 -0
  68. package/dist/bridge/session-map.d.ts.map +1 -0
  69. package/dist/bridge/session-map.js +78 -0
  70. package/dist/bridge/session-map.js.map +1 -0
  71. package/dist/bridge/stream-coalescer.d.ts +26 -0
  72. package/dist/bridge/stream-coalescer.d.ts.map +1 -0
  73. package/dist/bridge/stream-coalescer.js +82 -0
  74. package/dist/bridge/stream-coalescer.js.map +1 -0
  75. package/dist/bridge/supervisor.d.ts +50 -0
  76. package/dist/bridge/supervisor.d.ts.map +1 -0
  77. package/dist/bridge/supervisor.js +139 -0
  78. package/dist/bridge/supervisor.js.map +1 -0
  79. package/dist/bridge/tool-server.d.ts +73 -0
  80. package/dist/bridge/tool-server.d.ts.map +1 -0
  81. package/dist/bridge/tool-server.js +209 -0
  82. package/dist/bridge/tool-server.js.map +1 -0
  83. package/dist/canvas/components.d.ts +71 -0
  84. package/dist/canvas/components.d.ts.map +1 -0
  85. package/dist/canvas/components.js +2 -0
  86. package/dist/canvas/components.js.map +1 -0
  87. package/dist/canvas/renderer.d.ts +2 -0
  88. package/dist/canvas/renderer.d.ts.map +1 -0
  89. package/dist/canvas/renderer.js +240 -0
  90. package/dist/canvas/renderer.js.map +1 -0
  91. package/dist/canvas/server.d.ts +24 -0
  92. package/dist/canvas/server.d.ts.map +1 -0
  93. package/dist/canvas/server.js +134 -0
  94. package/dist/canvas/server.js.map +1 -0
  95. package/dist/canvas/session.d.ts +23 -0
  96. package/dist/canvas/session.d.ts.map +1 -0
  97. package/dist/canvas/session.js +64 -0
  98. package/dist/canvas/session.js.map +1 -0
  99. package/dist/channels/adapter.d.ts +90 -0
  100. package/dist/channels/adapter.d.ts.map +1 -0
  101. package/dist/channels/adapter.js +2 -0
  102. package/dist/channels/adapter.js.map +1 -0
  103. package/dist/channels/discord/client.d.ts +3 -0
  104. package/dist/channels/discord/client.d.ts.map +1 -0
  105. package/dist/channels/discord/client.js +13 -0
  106. package/dist/channels/discord/client.js.map +1 -0
  107. package/dist/channels/discord/index.d.ts +41 -0
  108. package/dist/channels/discord/index.d.ts.map +1 -0
  109. package/dist/channels/discord/index.js +113 -0
  110. package/dist/channels/discord/index.js.map +1 -0
  111. package/dist/channels/discord/normalize.d.ts +4 -0
  112. package/dist/channels/discord/normalize.d.ts.map +1 -0
  113. package/dist/channels/discord/normalize.js +20 -0
  114. package/dist/channels/discord/normalize.js.map +1 -0
  115. package/dist/channels/discord/send.d.ts +13 -0
  116. package/dist/channels/discord/send.d.ts.map +1 -0
  117. package/dist/channels/discord/send.js +54 -0
  118. package/dist/channels/discord/send.js.map +1 -0
  119. package/dist/channels/mention-gating.d.ts +13 -0
  120. package/dist/channels/mention-gating.d.ts.map +1 -0
  121. package/dist/channels/mention-gating.js +42 -0
  122. package/dist/channels/mention-gating.js.map +1 -0
  123. package/dist/channels/message-cache.d.ts +17 -0
  124. package/dist/channels/message-cache.d.ts.map +1 -0
  125. package/dist/channels/message-cache.js +43 -0
  126. package/dist/channels/message-cache.js.map +1 -0
  127. package/dist/channels/registry.d.ts +9 -0
  128. package/dist/channels/registry.d.ts.map +1 -0
  129. package/dist/channels/registry.js +19 -0
  130. package/dist/channels/registry.js.map +1 -0
  131. package/dist/channels/slack/index.d.ts +38 -0
  132. package/dist/channels/slack/index.d.ts.map +1 -0
  133. package/dist/channels/slack/index.js +105 -0
  134. package/dist/channels/slack/index.js.map +1 -0
  135. package/dist/channels/slack/normalize.d.ts +14 -0
  136. package/dist/channels/slack/normalize.d.ts.map +1 -0
  137. package/dist/channels/slack/normalize.js +23 -0
  138. package/dist/channels/slack/normalize.js.map +1 -0
  139. package/dist/channels/slack/send.d.ts +13 -0
  140. package/dist/channels/slack/send.d.ts.map +1 -0
  141. package/dist/channels/slack/send.js +48 -0
  142. package/dist/channels/slack/send.js.map +1 -0
  143. package/dist/channels/telegram/index.d.ts +42 -0
  144. package/dist/channels/telegram/index.d.ts.map +1 -0
  145. package/dist/channels/telegram/index.js +125 -0
  146. package/dist/channels/telegram/index.js.map +1 -0
  147. package/dist/channels/telegram/normalize.d.ts +4 -0
  148. package/dist/channels/telegram/normalize.d.ts.map +1 -0
  149. package/dist/channels/telegram/normalize.js +25 -0
  150. package/dist/channels/telegram/normalize.js.map +1 -0
  151. package/dist/channels/telegram/send.d.ts +13 -0
  152. package/dist/channels/telegram/send.d.ts.map +1 -0
  153. package/dist/channels/telegram/send.js +55 -0
  154. package/dist/channels/telegram/send.js.map +1 -0
  155. package/dist/channels/webchat/index.d.ts +20 -0
  156. package/dist/channels/webchat/index.d.ts.map +1 -0
  157. package/dist/channels/webchat/index.js +42 -0
  158. package/dist/channels/webchat/index.js.map +1 -0
  159. package/dist/channels/whatsapp/connection.d.ts +43 -0
  160. package/dist/channels/whatsapp/connection.d.ts.map +1 -0
  161. package/dist/channels/whatsapp/connection.js +76 -0
  162. package/dist/channels/whatsapp/connection.js.map +1 -0
  163. package/dist/channels/whatsapp/index.d.ts +38 -0
  164. package/dist/channels/whatsapp/index.d.ts.map +1 -0
  165. package/dist/channels/whatsapp/index.js +99 -0
  166. package/dist/channels/whatsapp/index.js.map +1 -0
  167. package/dist/channels/whatsapp/normalize.d.ts +4 -0
  168. package/dist/channels/whatsapp/normalize.d.ts.map +1 -0
  169. package/dist/channels/whatsapp/normalize.js +31 -0
  170. package/dist/channels/whatsapp/normalize.js.map +1 -0
  171. package/dist/channels/whatsapp/send.d.ts +12 -0
  172. package/dist/channels/whatsapp/send.d.ts.map +1 -0
  173. package/dist/channels/whatsapp/send.js +48 -0
  174. package/dist/channels/whatsapp/send.js.map +1 -0
  175. package/dist/cli/banner.d.ts +2 -0
  176. package/dist/cli/banner.d.ts.map +1 -0
  177. package/dist/cli/banner.js +18 -0
  178. package/dist/cli/banner.js.map +1 -0
  179. package/dist/cli/commands/config-cmd.d.ts +13 -0
  180. package/dist/cli/commands/config-cmd.d.ts.map +1 -0
  181. package/dist/cli/commands/config-cmd.js +76 -0
  182. package/dist/cli/commands/config-cmd.js.map +1 -0
  183. package/dist/cli/commands/cron-cmd.d.ts +23 -0
  184. package/dist/cli/commands/cron-cmd.d.ts.map +1 -0
  185. package/dist/cli/commands/cron-cmd.js +88 -0
  186. package/dist/cli/commands/cron-cmd.js.map +1 -0
  187. package/dist/cli/commands/doctor.d.ts +7 -0
  188. package/dist/cli/commands/doctor.d.ts.map +1 -0
  189. package/dist/cli/commands/doctor.js +88 -0
  190. package/dist/cli/commands/doctor.js.map +1 -0
  191. package/dist/cli/commands/gateway.d.ts +8 -0
  192. package/dist/cli/commands/gateway.d.ts.map +1 -0
  193. package/dist/cli/commands/gateway.js +33 -0
  194. package/dist/cli/commands/gateway.js.map +1 -0
  195. package/dist/cli/commands/init.d.ts +7 -0
  196. package/dist/cli/commands/init.d.ts.map +1 -0
  197. package/dist/cli/commands/init.js +308 -0
  198. package/dist/cli/commands/init.js.map +1 -0
  199. package/dist/cli/commands/pairing.d.ts +19 -0
  200. package/dist/cli/commands/pairing.d.ts.map +1 -0
  201. package/dist/cli/commands/pairing.js +70 -0
  202. package/dist/cli/commands/pairing.js.map +1 -0
  203. package/dist/cli/commands/scan.d.ts +8 -0
  204. package/dist/cli/commands/scan.d.ts.map +1 -0
  205. package/dist/cli/commands/scan.js +39 -0
  206. package/dist/cli/commands/scan.js.map +1 -0
  207. package/dist/cli/commands/security.d.ts +15 -0
  208. package/dist/cli/commands/security.d.ts.map +1 -0
  209. package/dist/cli/commands/security.js +49 -0
  210. package/dist/cli/commands/security.js.map +1 -0
  211. package/dist/cli/commands/send.d.ts +10 -0
  212. package/dist/cli/commands/send.d.ts.map +1 -0
  213. package/dist/cli/commands/send.js +64 -0
  214. package/dist/cli/commands/send.js.map +1 -0
  215. package/dist/cli/commands/session.d.ts +13 -0
  216. package/dist/cli/commands/session.d.ts.map +1 -0
  217. package/dist/cli/commands/session.js +48 -0
  218. package/dist/cli/commands/session.js.map +1 -0
  219. package/dist/cli/commands/status.d.ts +7 -0
  220. package/dist/cli/commands/status.d.ts.map +1 -0
  221. package/dist/cli/commands/status.js +43 -0
  222. package/dist/cli/commands/status.js.map +1 -0
  223. package/dist/cli/executor.d.ts +19 -0
  224. package/dist/cli/executor.d.ts.map +1 -0
  225. package/dist/cli/executor.js +75 -0
  226. package/dist/cli/executor.js.map +1 -0
  227. package/dist/cli/program.d.ts +3 -0
  228. package/dist/cli/program.d.ts.map +1 -0
  229. package/dist/cli/program.js +49 -0
  230. package/dist/cli/program.js.map +1 -0
  231. package/dist/cli/registry.d.ts +15 -0
  232. package/dist/cli/registry.d.ts.map +1 -0
  233. package/dist/cli/registry.js +64 -0
  234. package/dist/cli/registry.js.map +1 -0
  235. package/dist/cli/types.d.ts +40 -0
  236. package/dist/cli/types.d.ts.map +1 -0
  237. package/dist/cli/types.js +2 -0
  238. package/dist/cli/types.js.map +1 -0
  239. package/dist/config/loader.d.ts +4 -0
  240. package/dist/config/loader.d.ts.map +1 -0
  241. package/dist/config/loader.js +31 -0
  242. package/dist/config/loader.js.map +1 -0
  243. package/dist/config/paths.d.ts +4 -0
  244. package/dist/config/paths.d.ts.map +1 -0
  245. package/dist/config/paths.js +14 -0
  246. package/dist/config/paths.js.map +1 -0
  247. package/dist/config/schema.d.ts +1414 -0
  248. package/dist/config/schema.d.ts.map +1 -0
  249. package/dist/config/schema.js +256 -0
  250. package/dist/config/schema.js.map +1 -0
  251. package/dist/config/types.d.ts +176 -0
  252. package/dist/config/types.d.ts.map +1 -0
  253. package/dist/config/types.js +2 -0
  254. package/dist/config/types.js.map +1 -0
  255. package/dist/cron/run-log.d.ts +14 -0
  256. package/dist/cron/run-log.d.ts.map +1 -0
  257. package/dist/cron/run-log.js +16 -0
  258. package/dist/cron/run-log.js.map +1 -0
  259. package/dist/cron/service.d.ts +29 -0
  260. package/dist/cron/service.d.ts.map +1 -0
  261. package/dist/cron/service.js +98 -0
  262. package/dist/cron/service.js.map +1 -0
  263. package/dist/cron/store.d.ts +20 -0
  264. package/dist/cron/store.d.ts.map +1 -0
  265. package/dist/cron/store.js +61 -0
  266. package/dist/cron/store.js.map +1 -0
  267. package/dist/gateway/adapters.d.ts +37 -0
  268. package/dist/gateway/adapters.d.ts.map +1 -0
  269. package/dist/gateway/adapters.js +83 -0
  270. package/dist/gateway/adapters.js.map +1 -0
  271. package/dist/gateway/health.d.ts +19 -0
  272. package/dist/gateway/health.d.ts.map +1 -0
  273. package/dist/gateway/health.js +117 -0
  274. package/dist/gateway/health.js.map +1 -0
  275. package/dist/gateway/intelligence-wiring.d.ts +38 -0
  276. package/dist/gateway/intelligence-wiring.d.ts.map +1 -0
  277. package/dist/gateway/intelligence-wiring.js +49 -0
  278. package/dist/gateway/intelligence-wiring.js.map +1 -0
  279. package/dist/gateway/lifecycle.d.ts +71 -0
  280. package/dist/gateway/lifecycle.d.ts.map +1 -0
  281. package/dist/gateway/lifecycle.js +318 -0
  282. package/dist/gateway/lifecycle.js.map +1 -0
  283. package/dist/gateway/metrics.d.ts +27 -0
  284. package/dist/gateway/metrics.d.ts.map +1 -0
  285. package/dist/gateway/metrics.js +99 -0
  286. package/dist/gateway/metrics.js.map +1 -0
  287. package/dist/gateway/security-wiring.d.ts +16 -0
  288. package/dist/gateway/security-wiring.d.ts.map +1 -0
  289. package/dist/gateway/security-wiring.js +18 -0
  290. package/dist/gateway/security-wiring.js.map +1 -0
  291. package/dist/gateway/shutdown.d.ts +37 -0
  292. package/dist/gateway/shutdown.d.ts.map +1 -0
  293. package/dist/gateway/shutdown.js +60 -0
  294. package/dist/gateway/shutdown.js.map +1 -0
  295. package/dist/governance/engine.d.ts +11 -0
  296. package/dist/governance/engine.d.ts.map +1 -0
  297. package/dist/governance/engine.js +57 -0
  298. package/dist/governance/engine.js.map +1 -0
  299. package/dist/governance/policy.d.ts +68 -0
  300. package/dist/governance/policy.d.ts.map +1 -0
  301. package/dist/governance/policy.js +300 -0
  302. package/dist/governance/policy.js.map +1 -0
  303. package/dist/governance/types.d.ts +18 -0
  304. package/dist/governance/types.d.ts.map +1 -0
  305. package/dist/governance/types.js +2 -0
  306. package/dist/governance/types.js.map +1 -0
  307. package/dist/heartbeat/active-hours.d.ts +7 -0
  308. package/dist/heartbeat/active-hours.d.ts.map +1 -0
  309. package/dist/heartbeat/active-hours.js +38 -0
  310. package/dist/heartbeat/active-hours.js.map +1 -0
  311. package/dist/heartbeat/activity.d.ts +16 -0
  312. package/dist/heartbeat/activity.d.ts.map +1 -0
  313. package/dist/heartbeat/activity.js +41 -0
  314. package/dist/heartbeat/activity.js.map +1 -0
  315. package/dist/heartbeat/checkers.d.ts +34 -0
  316. package/dist/heartbeat/checkers.d.ts.map +1 -0
  317. package/dist/heartbeat/checkers.js +161 -0
  318. package/dist/heartbeat/checkers.js.map +1 -0
  319. package/dist/heartbeat/coalesce.d.ts +16 -0
  320. package/dist/heartbeat/coalesce.d.ts.map +1 -0
  321. package/dist/heartbeat/coalesce.js +36 -0
  322. package/dist/heartbeat/coalesce.js.map +1 -0
  323. package/dist/heartbeat/empty-check.d.ts +12 -0
  324. package/dist/heartbeat/empty-check.d.ts.map +1 -0
  325. package/dist/heartbeat/empty-check.js +24 -0
  326. package/dist/heartbeat/empty-check.js.map +1 -0
  327. package/dist/heartbeat/engine.d.ts +39 -0
  328. package/dist/heartbeat/engine.d.ts.map +1 -0
  329. package/dist/heartbeat/engine.js +235 -0
  330. package/dist/heartbeat/engine.js.map +1 -0
  331. package/dist/heartbeat/store.d.ts +32 -0
  332. package/dist/heartbeat/store.d.ts.map +1 -0
  333. package/dist/heartbeat/store.js +127 -0
  334. package/dist/heartbeat/store.js.map +1 -0
  335. package/dist/heartbeat/types.d.ts +74 -0
  336. package/dist/heartbeat/types.d.ts.map +1 -0
  337. package/dist/heartbeat/types.js +2 -0
  338. package/dist/heartbeat/types.js.map +1 -0
  339. package/dist/heartbeat/visibility.d.ts +8 -0
  340. package/dist/heartbeat/visibility.d.ts.map +1 -0
  341. package/dist/heartbeat/visibility.js +13 -0
  342. package/dist/heartbeat/visibility.js.map +1 -0
  343. package/dist/index.d.ts +2 -0
  344. package/dist/index.d.ts.map +1 -0
  345. package/dist/index.js +4 -0
  346. package/dist/index.js.map +1 -0
  347. package/dist/instance/coordinator.d.ts +30 -0
  348. package/dist/instance/coordinator.d.ts.map +1 -0
  349. package/dist/instance/coordinator.js +113 -0
  350. package/dist/instance/coordinator.js.map +1 -0
  351. package/dist/intelligence/arcs/detector.d.ts +57 -0
  352. package/dist/intelligence/arcs/detector.d.ts.map +1 -0
  353. package/dist/intelligence/arcs/detector.js +140 -0
  354. package/dist/intelligence/arcs/detector.js.map +1 -0
  355. package/dist/intelligence/arcs/lifecycle.d.ts +39 -0
  356. package/dist/intelligence/arcs/lifecycle.d.ts.map +1 -0
  357. package/dist/intelligence/arcs/lifecycle.js +87 -0
  358. package/dist/intelligence/arcs/lifecycle.js.map +1 -0
  359. package/dist/intelligence/arcs/store.d.ts +30 -0
  360. package/dist/intelligence/arcs/store.d.ts.map +1 -0
  361. package/dist/intelligence/arcs/store.js +117 -0
  362. package/dist/intelligence/arcs/store.js.map +1 -0
  363. package/dist/intelligence/bus.d.ts +21 -0
  364. package/dist/intelligence/bus.d.ts.map +1 -0
  365. package/dist/intelligence/bus.js +26 -0
  366. package/dist/intelligence/bus.js.map +1 -0
  367. package/dist/intelligence/cross-channel/resolver.d.ts +43 -0
  368. package/dist/intelligence/cross-channel/resolver.d.ts.map +1 -0
  369. package/dist/intelligence/cross-channel/resolver.js +129 -0
  370. package/dist/intelligence/cross-channel/resolver.js.map +1 -0
  371. package/dist/intelligence/goals/lifecycle.d.ts +66 -0
  372. package/dist/intelligence/goals/lifecycle.d.ts.map +1 -0
  373. package/dist/intelligence/goals/lifecycle.js +135 -0
  374. package/dist/intelligence/goals/lifecycle.js.map +1 -0
  375. package/dist/intelligence/goals/store.d.ts +30 -0
  376. package/dist/intelligence/goals/store.d.ts.map +1 -0
  377. package/dist/intelligence/goals/store.js +105 -0
  378. package/dist/intelligence/goals/store.js.map +1 -0
  379. package/dist/intelligence/health/gate.d.ts +41 -0
  380. package/dist/intelligence/health/gate.d.ts.map +1 -0
  381. package/dist/intelligence/health/gate.js +140 -0
  382. package/dist/intelligence/health/gate.js.map +1 -0
  383. package/dist/intelligence/health/trend-detector.d.ts +43 -0
  384. package/dist/intelligence/health/trend-detector.d.ts.map +1 -0
  385. package/dist/intelligence/health/trend-detector.js +160 -0
  386. package/dist/intelligence/health/trend-detector.js.map +1 -0
  387. package/dist/intelligence/inference/engine.d.ts +32 -0
  388. package/dist/intelligence/inference/engine.d.ts.map +1 -0
  389. package/dist/intelligence/inference/engine.js +98 -0
  390. package/dist/intelligence/inference/engine.js.map +1 -0
  391. package/dist/intelligence/inference/rules/engagement-trend.d.ts +9 -0
  392. package/dist/intelligence/inference/rules/engagement-trend.d.ts.map +1 -0
  393. package/dist/intelligence/inference/rules/engagement-trend.js +50 -0
  394. package/dist/intelligence/inference/rules/engagement-trend.js.map +1 -0
  395. package/dist/intelligence/inference/rules/index.d.ts +3 -0
  396. package/dist/intelligence/inference/rules/index.d.ts.map +1 -0
  397. package/dist/intelligence/inference/rules/index.js +13 -0
  398. package/dist/intelligence/inference/rules/index.js.map +1 -0
  399. package/dist/intelligence/inference/rules/language-stability.d.ts +9 -0
  400. package/dist/intelligence/inference/rules/language-stability.d.ts.map +1 -0
  401. package/dist/intelligence/inference/rules/language-stability.js +68 -0
  402. package/dist/intelligence/inference/rules/language-stability.js.map +1 -0
  403. package/dist/intelligence/inference/rules/response-cadence.d.ts +9 -0
  404. package/dist/intelligence/inference/rules/response-cadence.d.ts.map +1 -0
  405. package/dist/intelligence/inference/rules/response-cadence.js +53 -0
  406. package/dist/intelligence/inference/rules/response-cadence.js.map +1 -0
  407. package/dist/intelligence/inference/rules/session-pattern.d.ts +9 -0
  408. package/dist/intelligence/inference/rules/session-pattern.d.ts.map +1 -0
  409. package/dist/intelligence/inference/rules/session-pattern.js +53 -0
  410. package/dist/intelligence/inference/rules/session-pattern.js.map +1 -0
  411. package/dist/intelligence/inference/rules/timezone-from-hours.d.ts +3 -0
  412. package/dist/intelligence/inference/rules/timezone-from-hours.d.ts.map +1 -0
  413. package/dist/intelligence/inference/rules/timezone-from-hours.js +93 -0
  414. package/dist/intelligence/inference/rules/timezone-from-hours.js.map +1 -0
  415. package/dist/intelligence/inference/store.d.ts +21 -0
  416. package/dist/intelligence/inference/store.d.ts.map +1 -0
  417. package/dist/intelligence/inference/store.js +82 -0
  418. package/dist/intelligence/inference/store.js.map +1 -0
  419. package/dist/intelligence/outcomes/analyzer.d.ts +52 -0
  420. package/dist/intelligence/outcomes/analyzer.d.ts.map +1 -0
  421. package/dist/intelligence/outcomes/analyzer.js +103 -0
  422. package/dist/intelligence/outcomes/analyzer.js.map +1 -0
  423. package/dist/intelligence/outcomes/categorizer.d.ts +12 -0
  424. package/dist/intelligence/outcomes/categorizer.d.ts.map +1 -0
  425. package/dist/intelligence/outcomes/categorizer.js +19 -0
  426. package/dist/intelligence/outcomes/categorizer.js.map +1 -0
  427. package/dist/intelligence/outcomes/store.d.ts +21 -0
  428. package/dist/intelligence/outcomes/store.d.ts.map +1 -0
  429. package/dist/intelligence/outcomes/store.js +107 -0
  430. package/dist/intelligence/outcomes/store.js.map +1 -0
  431. package/dist/intelligence/prompt-assembler.d.ts +39 -0
  432. package/dist/intelligence/prompt-assembler.d.ts.map +1 -0
  433. package/dist/intelligence/prompt-assembler.js +99 -0
  434. package/dist/intelligence/prompt-assembler.js.map +1 -0
  435. package/dist/intelligence/store.d.ts +50 -0
  436. package/dist/intelligence/store.d.ts.map +1 -0
  437. package/dist/intelligence/store.js +102 -0
  438. package/dist/intelligence/store.js.map +1 -0
  439. package/dist/intelligence/triggers/evaluator.d.ts +27 -0
  440. package/dist/intelligence/triggers/evaluator.d.ts.map +1 -0
  441. package/dist/intelligence/triggers/evaluator.js +81 -0
  442. package/dist/intelligence/triggers/evaluator.js.map +1 -0
  443. package/dist/intelligence/triggers/rules.d.ts +10 -0
  444. package/dist/intelligence/triggers/rules.d.ts.map +1 -0
  445. package/dist/intelligence/triggers/rules.js +186 -0
  446. package/dist/intelligence/triggers/rules.js.map +1 -0
  447. package/dist/intelligence/types.d.ts +182 -0
  448. package/dist/intelligence/types.d.ts.map +1 -0
  449. package/dist/intelligence/types.js +3 -0
  450. package/dist/intelligence/types.js.map +1 -0
  451. package/dist/logging/logger.d.ts +5 -0
  452. package/dist/logging/logger.d.ts.map +1 -0
  453. package/dist/logging/logger.js +20 -0
  454. package/dist/logging/logger.js.map +1 -0
  455. package/dist/media/compress.d.ts +13 -0
  456. package/dist/media/compress.d.ts.map +1 -0
  457. package/dist/media/compress.js +38 -0
  458. package/dist/media/compress.js.map +1 -0
  459. package/dist/media/fetch.d.ts +18 -0
  460. package/dist/media/fetch.d.ts.map +1 -0
  461. package/dist/media/fetch.js +62 -0
  462. package/dist/media/fetch.js.map +1 -0
  463. package/dist/media/mime.d.ts +11 -0
  464. package/dist/media/mime.d.ts.map +1 -0
  465. package/dist/media/mime.js +112 -0
  466. package/dist/media/mime.js.map +1 -0
  467. package/dist/media/parse.d.ts +20 -0
  468. package/dist/media/parse.d.ts.map +1 -0
  469. package/dist/media/parse.js +52 -0
  470. package/dist/media/parse.js.map +1 -0
  471. package/dist/media/server.d.ts +17 -0
  472. package/dist/media/server.d.ts.map +1 -0
  473. package/dist/media/server.js +76 -0
  474. package/dist/media/server.js.map +1 -0
  475. package/dist/media/store.d.ts +26 -0
  476. package/dist/media/store.d.ts.map +1 -0
  477. package/dist/media/store.js +100 -0
  478. package/dist/media/store.js.map +1 -0
  479. package/dist/onboarding/enricher.d.ts +25 -0
  480. package/dist/onboarding/enricher.d.ts.map +1 -0
  481. package/dist/onboarding/enricher.js +151 -0
  482. package/dist/onboarding/enricher.js.map +1 -0
  483. package/dist/onboarding/signals.d.ts +13 -0
  484. package/dist/onboarding/signals.d.ts.map +1 -0
  485. package/dist/onboarding/signals.js +79 -0
  486. package/dist/onboarding/signals.js.map +1 -0
  487. package/dist/onboarding/types.d.ts +28 -0
  488. package/dist/onboarding/types.d.ts.map +1 -0
  489. package/dist/onboarding/types.js +2 -0
  490. package/dist/onboarding/types.js.map +1 -0
  491. package/dist/plugins/hook-bus.d.ts +7 -0
  492. package/dist/plugins/hook-bus.d.ts.map +1 -0
  493. package/dist/plugins/hook-bus.js +25 -0
  494. package/dist/plugins/hook-bus.js.map +1 -0
  495. package/dist/plugins/loader.d.ts +14 -0
  496. package/dist/plugins/loader.d.ts.map +1 -0
  497. package/dist/plugins/loader.js +108 -0
  498. package/dist/plugins/loader.js.map +1 -0
  499. package/dist/plugins/registry.d.ts +13 -0
  500. package/dist/plugins/registry.d.ts.map +1 -0
  501. package/dist/plugins/registry.js +32 -0
  502. package/dist/plugins/registry.js.map +1 -0
  503. package/dist/plugins/types.d.ts +67 -0
  504. package/dist/plugins/types.d.ts.map +1 -0
  505. package/dist/plugins/types.js +2 -0
  506. package/dist/plugins/types.js.map +1 -0
  507. package/dist/proactive/engine.d.ts +46 -0
  508. package/dist/proactive/engine.d.ts.map +1 -0
  509. package/dist/proactive/engine.js +238 -0
  510. package/dist/proactive/engine.js.map +1 -0
  511. package/dist/proactive/store.d.ts +35 -0
  512. package/dist/proactive/store.d.ts.map +1 -0
  513. package/dist/proactive/store.js +186 -0
  514. package/dist/proactive/store.js.map +1 -0
  515. package/dist/proactive/types.d.ts +91 -0
  516. package/dist/proactive/types.d.ts.map +1 -0
  517. package/dist/proactive/types.js +2 -0
  518. package/dist/proactive/types.js.map +1 -0
  519. package/dist/sdk/client.d.ts +222 -0
  520. package/dist/sdk/client.d.ts.map +1 -0
  521. package/dist/sdk/client.js +108 -0
  522. package/dist/sdk/client.js.map +1 -0
  523. package/dist/security/allowlist-store.d.ts +17 -0
  524. package/dist/security/allowlist-store.d.ts.map +1 -0
  525. package/dist/security/allowlist-store.js +52 -0
  526. package/dist/security/allowlist-store.js.map +1 -0
  527. package/dist/security/dm-policy.d.ts +32 -0
  528. package/dist/security/dm-policy.d.ts.map +1 -0
  529. package/dist/security/dm-policy.js +67 -0
  530. package/dist/security/dm-policy.js.map +1 -0
  531. package/dist/security/pairing-store.d.ts +25 -0
  532. package/dist/security/pairing-store.d.ts.map +1 -0
  533. package/dist/security/pairing-store.js +103 -0
  534. package/dist/security/pairing-store.js.map +1 -0
  535. package/dist/security/rate-limiter.d.ts +17 -0
  536. package/dist/security/rate-limiter.d.ts.map +1 -0
  537. package/dist/security/rate-limiter.js +43 -0
  538. package/dist/security/rate-limiter.js.map +1 -0
  539. package/dist/security/scan-rules.d.ts +3 -0
  540. package/dist/security/scan-rules.d.ts.map +1 -0
  541. package/dist/security/scan-rules.js +79 -0
  542. package/dist/security/scan-rules.js.map +1 -0
  543. package/dist/security/scan-types.d.ts +27 -0
  544. package/dist/security/scan-types.d.ts.map +1 -0
  545. package/dist/security/scan-types.js +2 -0
  546. package/dist/security/scan-types.js.map +1 -0
  547. package/dist/security/scanner.d.ts +8 -0
  548. package/dist/security/scanner.d.ts.map +1 -0
  549. package/dist/security/scanner.js +105 -0
  550. package/dist/security/scanner.js.map +1 -0
  551. package/dist/usage/tracker.d.ts +13 -0
  552. package/dist/usage/tracker.d.ts.map +1 -0
  553. package/dist/usage/tracker.js +66 -0
  554. package/dist/usage/tracker.js.map +1 -0
  555. package/dist/usage/types.d.ts +28 -0
  556. package/dist/usage/types.d.ts.map +1 -0
  557. package/dist/usage/types.js +2 -0
  558. package/dist/usage/types.js.map +1 -0
  559. package/dist/utils/file-lock.d.ts +2 -0
  560. package/dist/utils/file-lock.d.ts.map +1 -0
  561. package/dist/utils/file-lock.js +15 -0
  562. package/dist/utils/file-lock.js.map +1 -0
  563. package/dist/utils/retry.d.ts +8 -0
  564. package/dist/utils/retry.d.ts.map +1 -0
  565. package/dist/utils/retry.js +35 -0
  566. package/dist/utils/retry.js.map +1 -0
  567. package/dist/utils/text-chunker.d.ts +3 -0
  568. package/dist/utils/text-chunker.d.ts.map +1 -0
  569. package/dist/utils/text-chunker.js +58 -0
  570. package/dist/utils/text-chunker.js.map +1 -0
  571. package/dist/utils/typed-emitter.d.ts +14 -0
  572. package/dist/utils/typed-emitter.d.ts.map +1 -0
  573. package/dist/utils/typed-emitter.js +27 -0
  574. package/dist/utils/typed-emitter.js.map +1 -0
  575. package/dist/utils/types.d.ts +22 -0
  576. package/dist/utils/types.d.ts.map +1 -0
  577. package/dist/utils/types.js +13 -0
  578. package/dist/utils/types.js.map +1 -0
  579. package/dist/vault/db.d.ts +19 -0
  580. package/dist/vault/db.d.ts.map +1 -0
  581. package/dist/vault/db.js +201 -0
  582. package/dist/vault/db.js.map +1 -0
  583. package/dist/vault/search.d.ts +16 -0
  584. package/dist/vault/search.d.ts.map +1 -0
  585. package/dist/vault/search.js +75 -0
  586. package/dist/vault/search.js.map +1 -0
  587. package/dist/vault/store.d.ts +68 -0
  588. package/dist/vault/store.d.ts.map +1 -0
  589. package/dist/vault/store.js +170 -0
  590. package/dist/vault/store.js.map +1 -0
  591. package/dist/vault/types.d.ts +50 -0
  592. package/dist/vault/types.d.ts.map +1 -0
  593. package/dist/vault/types.js +2 -0
  594. package/dist/vault/types.js.map +1 -0
  595. package/docs/sdk/getting-started.md +133 -0
  596. package/package.json +87 -0
@@ -0,0 +1,127 @@
1
+ const HEARTBEAT_SCHEMA = `
2
+ CREATE TABLE IF NOT EXISTS heartbeat_log (
3
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
4
+ component TEXT NOT NULL, status TEXT NOT NULL,
5
+ latency_ms INTEGER NOT NULL, details TEXT,
6
+ agent_id TEXT NOT NULL DEFAULT 'default',
7
+ checked_at INTEGER NOT NULL
8
+ );
9
+ CREATE INDEX IF NOT EXISTS idx_heartbeat_component ON heartbeat_log(component, checked_at);
10
+
11
+ CREATE TABLE IF NOT EXISTS heartbeat_actions (
12
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
13
+ component TEXT NOT NULL, action TEXT NOT NULL,
14
+ success INTEGER NOT NULL DEFAULT 0, error TEXT,
15
+ agent_id TEXT NOT NULL DEFAULT 'default',
16
+ executed_at INTEGER NOT NULL
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_actions_component ON heartbeat_actions(component, executed_at);
19
+
20
+ CREATE TABLE IF NOT EXISTS heartbeat_dedup (
21
+ component TEXT NOT NULL,
22
+ agent_id TEXT NOT NULL DEFAULT 'default',
23
+ last_alert_text TEXT NOT NULL,
24
+ last_sent_at INTEGER NOT NULL,
25
+ PRIMARY KEY (component, agent_id)
26
+ );
27
+ `;
28
+ export class HeartbeatStore {
29
+ db;
30
+ constructor(vaultDb) {
31
+ this.db = vaultDb.raw();
32
+ this.db.exec(HEARTBEAT_SCHEMA);
33
+ }
34
+ logCheck(params) {
35
+ this.db
36
+ .prepare(`INSERT INTO heartbeat_log (component, status, latency_ms, details, agent_id, checked_at)
37
+ VALUES (?, ?, ?, ?, ?, ?)`)
38
+ .run(params.component, params.status, params.latencyMs, params.details ?? null, params.agentId ?? "default", Date.now());
39
+ }
40
+ logAction(params) {
41
+ this.db
42
+ .prepare(`INSERT INTO heartbeat_actions (component, action, success, error, agent_id, executed_at)
43
+ VALUES (?, ?, ?, ?, ?, ?)`)
44
+ .run(params.component, params.action, params.success ? 1 : 0, params.error ?? null, params.agentId ?? "default", Date.now());
45
+ }
46
+ getRecentLogs(component, limit) {
47
+ const rows = this.db
48
+ .prepare(`SELECT * FROM heartbeat_log
49
+ WHERE component = ?
50
+ ORDER BY checked_at DESC LIMIT ?`)
51
+ .all(component, limit);
52
+ return rows.map((r) => this.toLogEntry(r));
53
+ }
54
+ getRecentActions(component, limit) {
55
+ const rows = this.db
56
+ .prepare(`SELECT * FROM heartbeat_actions
57
+ WHERE component = ?
58
+ ORDER BY executed_at DESC LIMIT ?`)
59
+ .all(component, limit);
60
+ return rows.map((r) => this.toActionEntry(r));
61
+ }
62
+ getLatestStatus() {
63
+ const rows = this.db
64
+ .prepare(`SELECT component, status FROM heartbeat_log
65
+ WHERE checked_at = (
66
+ SELECT MAX(checked_at) FROM heartbeat_log AS hl
67
+ WHERE hl.component = heartbeat_log.component
68
+ )`)
69
+ .all();
70
+ const result = new Map();
71
+ for (const row of rows) {
72
+ result.set(row["component"], row["status"]);
73
+ }
74
+ return result;
75
+ }
76
+ purgeOlderThan(retentionMs) {
77
+ const cutoff = Date.now() - retentionMs;
78
+ const logs = this.db
79
+ .prepare("DELETE FROM heartbeat_log WHERE checked_at <= ?")
80
+ .run(cutoff);
81
+ const actions = this.db
82
+ .prepare("DELETE FROM heartbeat_actions WHERE executed_at <= ?")
83
+ .run(cutoff);
84
+ return logs.changes + actions.changes;
85
+ }
86
+ isDuplicate(component, agentId, text, windowMs) {
87
+ const row = this.db
88
+ .prepare(`SELECT last_alert_text, last_sent_at FROM heartbeat_dedup
89
+ WHERE component = ? AND agent_id = ?`)
90
+ .get(component, agentId);
91
+ if (!row)
92
+ return false;
93
+ if (row.last_alert_text.trim() !== text.trim())
94
+ return false;
95
+ return Date.now() - row.last_sent_at < windowMs;
96
+ }
97
+ recordAlert(component, agentId, text) {
98
+ this.db
99
+ .prepare(`INSERT INTO heartbeat_dedup (component, agent_id, last_alert_text, last_sent_at)
100
+ VALUES (?, ?, ?, ?)
101
+ ON CONFLICT(component, agent_id)
102
+ DO UPDATE SET last_alert_text = excluded.last_alert_text, last_sent_at = excluded.last_sent_at`)
103
+ .run(component, agentId, text.trim(), Date.now());
104
+ }
105
+ // ── Row mappers ──
106
+ toLogEntry(row) {
107
+ return {
108
+ id: row["id"],
109
+ component: row["component"],
110
+ status: row["status"],
111
+ latencyMs: row["latency_ms"],
112
+ details: row["details"] ?? null,
113
+ checkedAt: row["checked_at"],
114
+ };
115
+ }
116
+ toActionEntry(row) {
117
+ return {
118
+ id: row["id"],
119
+ component: row["component"],
120
+ action: row["action"],
121
+ success: row["success"] === 1,
122
+ error: row["error"] ?? null,
123
+ executedAt: row["executed_at"],
124
+ };
125
+ }
126
+ }
127
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/heartbeat/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ export type HealthStatus = "healthy" | "degraded" | "down" | "recovering";
2
+ export interface HealthResult {
3
+ readonly component: string;
4
+ readonly status: HealthStatus;
5
+ readonly latencyMs: number;
6
+ readonly details?: string;
7
+ }
8
+ export interface HealthChecker {
9
+ readonly name: string;
10
+ check(): Promise<HealthResult>;
11
+ heal?(): Promise<boolean>;
12
+ }
13
+ export interface HeartbeatLogEntry {
14
+ readonly id: number;
15
+ readonly component: string;
16
+ readonly status: string;
17
+ readonly latencyMs: number;
18
+ readonly details: string | null;
19
+ readonly checkedAt: number;
20
+ }
21
+ export interface HeartbeatActionEntry {
22
+ readonly id: number;
23
+ readonly component: string;
24
+ readonly action: string;
25
+ readonly success: boolean;
26
+ readonly error: string | null;
27
+ readonly executedAt: number;
28
+ }
29
+ export interface ActiveHoursConfig {
30
+ readonly start: string;
31
+ readonly end: string;
32
+ readonly timezone: string;
33
+ }
34
+ export interface VisibilityConfig {
35
+ readonly showOk: boolean;
36
+ readonly showAlerts: boolean;
37
+ readonly useIndicator: boolean;
38
+ }
39
+ export interface EmptyCheckConfig {
40
+ readonly enabled: boolean;
41
+ readonly maxBackoffMs: number;
42
+ }
43
+ export interface HeartbeatConfig {
44
+ readonly enabled: boolean;
45
+ readonly intervals: {
46
+ readonly healthy: number;
47
+ readonly degraded: number;
48
+ readonly critical: number;
49
+ };
50
+ readonly selfHeal: {
51
+ readonly enabled: boolean;
52
+ readonly maxAttempts: number;
53
+ readonly backoffTicks: number;
54
+ };
55
+ readonly activity: {
56
+ readonly enabled: boolean;
57
+ readonly dormancyThresholdMs: number;
58
+ };
59
+ readonly logRetentionDays: number;
60
+ readonly activeHours?: ActiveHoursConfig;
61
+ readonly visibility?: VisibilityConfig;
62
+ readonly channelVisibility?: Record<string, Partial<VisibilityConfig>>;
63
+ readonly dedupWindowMs?: number;
64
+ readonly emptyCheck?: EmptyCheckConfig;
65
+ readonly coalesceMs?: number;
66
+ readonly retryMs?: number;
67
+ readonly agents?: HeartbeatAgentConfig[];
68
+ }
69
+ export interface HeartbeatAgentConfig {
70
+ readonly agentId: string;
71
+ readonly intervals?: Partial<HeartbeatConfig["intervals"]>;
72
+ readonly activeHours?: ActiveHoursConfig;
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/heartbeat/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/heartbeat/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface VisibilityConfig {
2
+ readonly showOk: boolean;
3
+ readonly showAlerts: boolean;
4
+ readonly useIndicator: boolean;
5
+ }
6
+ export type ChannelVisibilityOverrides = Record<string, Partial<VisibilityConfig>>;
7
+ export declare function resolveVisibility(global: VisibilityConfig | undefined, channelOverrides: ChannelVisibilityOverrides | undefined, channelId: string): VisibilityConfig;
8
+ //# sourceMappingURL=visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../src/heartbeat/visibility.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAInF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,gBAAgB,EAAE,0BAA0B,GAAG,SAAS,EACxD,SAAS,EAAE,MAAM,GAChB,gBAAgB,CAUlB"}
@@ -0,0 +1,13 @@
1
+ const DEFAULTS = { showOk: false, showAlerts: true, useIndicator: true };
2
+ export function resolveVisibility(global, channelOverrides, channelId) {
3
+ const base = global ?? DEFAULTS;
4
+ const override = channelOverrides?.[channelId];
5
+ if (!override)
6
+ return { ...base };
7
+ return {
8
+ showOk: override.showOk ?? base.showOk,
9
+ showAlerts: override.showAlerts ?? base.showAlerts,
10
+ useIndicator: override.useIndicator ?? base.useIndicator,
11
+ };
12
+ }
13
+ //# sourceMappingURL=visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.js","sourceRoot":"","sources":["../../src/heartbeat/visibility.ts"],"names":[],"mappings":"AAQA,MAAM,QAAQ,GAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAE3F,MAAM,UAAU,iBAAiB,CAC/B,MAAoC,EACpC,gBAAwD,EACxD,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,IAAI,QAAQ,CAAC;IAChC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAElC,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;QACtC,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QAClD,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;KACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import { createCli } from "./cli/program.js";
2
+ const cli = createCli();
3
+ cli.runExit(process.argv.slice(2));
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AACxB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type Database from "better-sqlite3";
2
+ export type LeaderChangeHandler = (isLeader: boolean) => void;
3
+ /**
4
+ * Coordinates multiple iris-gateway instances sharing a single SQLite file.
5
+ *
6
+ * - Each instance gets a unique ID (IRIS_INSTANCE_ID env var or auto UUID).
7
+ * - Leader election uses a single-row `instance_locks` table with a TTL.
8
+ * - Only the leader runs singleton operations (cron, intelligence sweep, proactive engine).
9
+ * - Session affinity is advisory: consumers may use `instanceId` as a routing hint.
10
+ */
11
+ export declare class InstanceCoordinator {
12
+ readonly instanceId: string;
13
+ private db;
14
+ private isLeader;
15
+ private timer;
16
+ private readonly handlers;
17
+ constructor(db: Database.Database);
18
+ private ensureSchema;
19
+ /** Start heartbeat loop; attempt leader election immediately. */
20
+ start(): void;
21
+ stop(): void;
22
+ get leader(): boolean;
23
+ onLeaderChange(handler: LeaderChangeHandler): void;
24
+ private tick;
25
+ private tryAcquire;
26
+ private setLeader;
27
+ /** Returns IDs of instances seen within the last 30 s. */
28
+ activeInstances(): string[];
29
+ }
30
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/instance/coordinator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAE9D;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAE1C,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAOjC,OAAO,CAAC,YAAY;IAepB,iEAAiE;IACjE,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAoBZ,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAIlD,OAAO,CAAC,IAAI;IAgBZ,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,SAAS;IAOjB,0DAA0D;IAC1D,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
@@ -0,0 +1,113 @@
1
+ import { randomUUID } from "node:crypto";
2
+ const LOCK_TTL_MS = 10_000; // 10 s — instance must renew before this expires
3
+ const RENEW_INTERVAL_MS = 4_000; // renew every 4 s (2.5× safety margin)
4
+ /**
5
+ * Coordinates multiple iris-gateway instances sharing a single SQLite file.
6
+ *
7
+ * - Each instance gets a unique ID (IRIS_INSTANCE_ID env var or auto UUID).
8
+ * - Leader election uses a single-row `instance_locks` table with a TTL.
9
+ * - Only the leader runs singleton operations (cron, intelligence sweep, proactive engine).
10
+ * - Session affinity is advisory: consumers may use `instanceId` as a routing hint.
11
+ */
12
+ export class InstanceCoordinator {
13
+ instanceId;
14
+ db;
15
+ isLeader = false;
16
+ timer = null;
17
+ handlers = [];
18
+ constructor(db) {
19
+ this.instanceId =
20
+ process.env["IRIS_INSTANCE_ID"] ?? randomUUID();
21
+ this.db = db;
22
+ this.ensureSchema();
23
+ }
24
+ ensureSchema() {
25
+ this.db.exec(`
26
+ CREATE TABLE IF NOT EXISTS instance_locks (
27
+ lock_name TEXT PRIMARY KEY,
28
+ holder_id TEXT NOT NULL,
29
+ acquired_at INTEGER NOT NULL,
30
+ expires_at INTEGER NOT NULL
31
+ );
32
+ CREATE TABLE IF NOT EXISTS instance_registry (
33
+ instance_id TEXT PRIMARY KEY,
34
+ last_seen INTEGER NOT NULL
35
+ );
36
+ `);
37
+ }
38
+ /** Start heartbeat loop; attempt leader election immediately. */
39
+ start() {
40
+ this.tick();
41
+ this.timer = setInterval(() => this.tick(), RENEW_INTERVAL_MS);
42
+ }
43
+ stop() {
44
+ if (this.timer) {
45
+ clearInterval(this.timer);
46
+ this.timer = null;
47
+ }
48
+ // Release lock if we hold it
49
+ try {
50
+ this.db
51
+ .prepare("DELETE FROM instance_locks WHERE lock_name = 'leader' AND holder_id = ?")
52
+ .run(this.instanceId);
53
+ }
54
+ catch {
55
+ // best-effort
56
+ }
57
+ if (this.isLeader) {
58
+ this.setLeader(false);
59
+ }
60
+ }
61
+ get leader() {
62
+ return this.isLeader;
63
+ }
64
+ onLeaderChange(handler) {
65
+ this.handlers.push(handler);
66
+ }
67
+ tick() {
68
+ const now = Date.now();
69
+ // Update presence
70
+ this.db
71
+ .prepare("INSERT OR REPLACE INTO instance_registry(instance_id, last_seen) VALUES (?, ?)")
72
+ .run(this.instanceId, now);
73
+ // Attempt to acquire or renew leader lock
74
+ const newLeader = this.tryAcquire(now);
75
+ if (newLeader !== this.isLeader) {
76
+ this.setLeader(newLeader);
77
+ }
78
+ }
79
+ tryAcquire(now) {
80
+ const expiresAt = now + LOCK_TTL_MS;
81
+ // Try to insert (acquire) or update (renew) atomically
82
+ this.db
83
+ .prepare(`INSERT INTO instance_locks(lock_name, holder_id, acquired_at, expires_at)
84
+ VALUES ('leader', ?, ?, ?)
85
+ ON CONFLICT(lock_name) DO UPDATE SET
86
+ holder_id = CASE WHEN expires_at < ? OR holder_id = ? THEN excluded.holder_id ELSE holder_id END,
87
+ acquired_at = CASE WHEN expires_at < ? OR holder_id = ? THEN excluded.acquired_at ELSE acquired_at END,
88
+ expires_at = CASE WHEN expires_at < ? OR holder_id = ? THEN excluded.expires_at ELSE expires_at END`)
89
+ .run(this.instanceId, now, expiresAt, now, this.instanceId, now, this.instanceId, now, this.instanceId);
90
+ // Check if we actually hold the lock now
91
+ const row = this.db
92
+ .prepare("SELECT holder_id FROM instance_locks WHERE lock_name = 'leader'")
93
+ .get();
94
+ return row?.holder_id === this.instanceId;
95
+ }
96
+ setLeader(value) {
97
+ this.isLeader = value;
98
+ for (const h of this.handlers) {
99
+ try {
100
+ h(value);
101
+ }
102
+ catch { /* ignore */ }
103
+ }
104
+ }
105
+ /** Returns IDs of instances seen within the last 30 s. */
106
+ activeInstances() {
107
+ const rows = this.db
108
+ .prepare("SELECT instance_id FROM instance_registry WHERE last_seen > ? ORDER BY last_seen DESC")
109
+ .all(Date.now() - 30_000);
110
+ return rows.map((r) => r.instance_id);
111
+ }
112
+ }
113
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/instance/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { IntelligenceStore } from "../store.js";
2
+ import type { IntelligenceBus } from "../bus.js";
3
+ import type { Logger } from "../../logging/logger.js";
4
+ export type TitleGeneratorFn = (keywords: string[], content: string) => Promise<string>;
5
+ /**
6
+ * Memory arc detector.
7
+ * When new vault facts (memories) are stored, this checks whether they
8
+ * belong to an existing arc or should start a new one.
9
+ *
10
+ * Deterministic keyword overlap — no AI.
11
+ *
12
+ * An arc is a temporal narrative thread: a sequence of related facts
13
+ * that track an evolving situation (e.g., "job search", "wedding planning").
14
+ */
15
+ export declare class ArcDetector {
16
+ private readonly store;
17
+ private readonly bus;
18
+ private readonly logger;
19
+ private readonly titleGenerator?;
20
+ private readonly userLanguage?;
21
+ private static readonly STOPWORD_MAP;
22
+ constructor(store: IntelligenceStore, bus: IntelligenceBus, logger: Logger, titleGenerator?: TitleGeneratorFn | undefined, userLanguage?: string | undefined);
23
+ /**
24
+ * Process a new memory/fact and attach it to an arc.
25
+ * If no matching arc exists and the content is substantial enough,
26
+ * creates a new arc.
27
+ *
28
+ * @param senderId - The user's ID
29
+ * @param content - The memory content (fact text)
30
+ * @param memoryId - Optional vault memory ID to link
31
+ * @param source - Where this came from (conversation, compaction, etc.)
32
+ * @param language - Per-sender detected language code (e.g. "ro", "ru", "en").
33
+ * Overrides the constructor-level userLanguage when provided,
34
+ * enabling correct per-sender stopword filtering in multi-user deployments.
35
+ */
36
+ processMemory(senderId: string, content: string, memoryId?: string, source?: "conversation" | "compaction" | "proactive" | "tool", language?: string): void;
37
+ /**
38
+ * Check for stale arcs and emit events.
39
+ * Called periodically (e.g., from PulseEngine passive scan).
40
+ */
41
+ scanStaleArcs(): void;
42
+ /**
43
+ * Extract meaningful keywords from text.
44
+ * Filters out stop words and short tokens.
45
+ *
46
+ * @param text - The text to extract keywords from.
47
+ * @param language - Optional language code for stopword filtering.
48
+ * Falls back to constructor-level userLanguage, then English.
49
+ */
50
+ private extractKeywords;
51
+ /**
52
+ * Generate a human-readable arc title from keywords.
53
+ * Takes the first 3-4 most distinctive words.
54
+ */
55
+ private generateTitle;
56
+ }
57
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/intelligence/arcs/detector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAGxF;;;;;;;;;GASG;AACH,qBAAa,WAAW;IAapB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAhBhC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CASlC;gBAGiB,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,gBAAgB,YAAA,EACjC,YAAY,CAAC,EAAE,MAAM,YAAA;IAGxC;;;;;;;;;;;;OAYG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,GAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,MAAuB,EAC7E,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IA4DP;;;OAGG;IACH,aAAa,IAAI,IAAI;IAYrB;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAevB;;;OAGG;IACH,OAAO,CAAC,aAAa;CAItB"}
@@ -0,0 +1,140 @@
1
+ import { metrics } from "../../gateway/metrics.js";
2
+ import { removeStopwords, eng, deu, fra, spa, por, ita, rus, ron } from "stopword";
3
+ /**
4
+ * Memory arc detector.
5
+ * When new vault facts (memories) are stored, this checks whether they
6
+ * belong to an existing arc or should start a new one.
7
+ *
8
+ * Deterministic keyword overlap — no AI.
9
+ *
10
+ * An arc is a temporal narrative thread: a sequence of related facts
11
+ * that track an evolving situation (e.g., "job search", "wedding planning").
12
+ */
13
+ export class ArcDetector {
14
+ store;
15
+ bus;
16
+ logger;
17
+ titleGenerator;
18
+ userLanguage;
19
+ static STOPWORD_MAP = {
20
+ en: eng,
21
+ de: deu,
22
+ fr: fra,
23
+ es: spa,
24
+ pt: por,
25
+ it: ita,
26
+ ru: rus,
27
+ ro: ron,
28
+ };
29
+ constructor(store, bus, logger, titleGenerator, userLanguage) {
30
+ this.store = store;
31
+ this.bus = bus;
32
+ this.logger = logger;
33
+ this.titleGenerator = titleGenerator;
34
+ this.userLanguage = userLanguage;
35
+ }
36
+ /**
37
+ * Process a new memory/fact and attach it to an arc.
38
+ * If no matching arc exists and the content is substantial enough,
39
+ * creates a new arc.
40
+ *
41
+ * @param senderId - The user's ID
42
+ * @param content - The memory content (fact text)
43
+ * @param memoryId - Optional vault memory ID to link
44
+ * @param source - Where this came from (conversation, compaction, etc.)
45
+ * @param language - Per-sender detected language code (e.g. "ro", "ru", "en").
46
+ * Overrides the constructor-level userLanguage when provided,
47
+ * enabling correct per-sender stopword filtering in multi-user deployments.
48
+ */
49
+ processMemory(senderId, content, memoryId, source = "conversation", language) {
50
+ const keywords = this.extractKeywords(content, language);
51
+ // Need at least 2 keywords to be meaningful
52
+ if (keywords.length < 2)
53
+ return;
54
+ // Try to match an existing active arc
55
+ const matchedArc = this.store.findArcByKeywords(senderId, keywords);
56
+ if (matchedArc) {
57
+ this.store.addArcEntry({
58
+ arcId: matchedArc.id,
59
+ content,
60
+ source,
61
+ memoryId,
62
+ });
63
+ this.logger.debug({ arcId: matchedArc.id, title: matchedArc.title }, "Memory added to existing arc");
64
+ return;
65
+ }
66
+ // No match — create a new arc if content is substantial
67
+ if (keywords.length >= 3 && content.length >= 30) {
68
+ const fallbackTitle = this.generateTitle(keywords);
69
+ const arc = this.store.createArc({
70
+ senderId,
71
+ title: fallbackTitle,
72
+ summary: content.substring(0, 200),
73
+ });
74
+ this.store.addArcEntry({
75
+ arcId: arc.id,
76
+ content,
77
+ source,
78
+ memoryId,
79
+ });
80
+ this.bus.emit({ type: "arc_created", senderId, arc });
81
+ this.logger.info({ arcId: arc.id, title: fallbackTitle }, "New memory arc created");
82
+ metrics.arcsDetected.inc();
83
+ // Async AI title upgrade (fire-and-forget)
84
+ if (this.titleGenerator) {
85
+ this.titleGenerator(keywords, content)
86
+ .then((aiTitle) => {
87
+ const cleaned = aiTitle.trim().replace(/^["']+|["']+$/g, "");
88
+ if (cleaned) {
89
+ this.store.updateArcTitle(arc.id, cleaned);
90
+ this.logger.debug({ arcId: arc.id, aiTitle: cleaned }, "Arc title improved by AI");
91
+ }
92
+ })
93
+ .catch((err) => {
94
+ this.logger.warn({ err, arcId: arc.id }, "AI title generation failed — keeping fallback");
95
+ });
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Check for stale arcs and emit events.
101
+ * Called periodically (e.g., from PulseEngine passive scan).
102
+ */
103
+ scanStaleArcs() {
104
+ const staleArcs = this.store.getStaleArcs();
105
+ for (const arc of staleArcs) {
106
+ this.store.updateArcStatus(arc.id, "stale");
107
+ this.bus.emit({ type: "arc_stale", senderId: arc.senderId, arcId: arc.id });
108
+ this.logger.info({ arcId: arc.id, title: arc.title }, "Arc marked stale");
109
+ }
110
+ }
111
+ /**
112
+ * Extract meaningful keywords from text.
113
+ * Filters out stop words and short tokens.
114
+ *
115
+ * @param text - The text to extract keywords from.
116
+ * @param language - Optional language code for stopword filtering.
117
+ * Falls back to constructor-level userLanguage, then English.
118
+ */
119
+ extractKeywords(text, language) {
120
+ const tokens = text
121
+ .toLowerCase()
122
+ .replace(/[^\p{L}\p{N}\s-]/gu, " ")
123
+ .split(/\s+/)
124
+ .filter((w) => w.length >= 3);
125
+ const lang = language ?? this.userLanguage;
126
+ const stopwords = lang
127
+ ? (ArcDetector.STOPWORD_MAP[lang] ?? eng)
128
+ : eng;
129
+ return removeStopwords(tokens, stopwords);
130
+ }
131
+ /**
132
+ * Generate a human-readable arc title from keywords.
133
+ * Takes the first 3-4 most distinctive words.
134
+ */
135
+ generateTitle(keywords) {
136
+ const unique = [...new Set(keywords)].slice(0, 4);
137
+ return unique.join(" ");
138
+ }
139
+ }
140
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/intelligence/arcs/detector.ts"],"names":[],"mappings":"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"}