reflectt-node 0.1.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 (486) hide show
  1. package/LICENSE +178 -0
  2. package/README.md +188 -0
  3. package/dist/activationEvents.d.ts +110 -0
  4. package/dist/activationEvents.d.ts.map +1 -0
  5. package/dist/activationEvents.js +378 -0
  6. package/dist/activationEvents.js.map +1 -0
  7. package/dist/activity-signal.d.ts +30 -0
  8. package/dist/activity-signal.d.ts.map +1 -0
  9. package/dist/activity-signal.js +93 -0
  10. package/dist/activity-signal.js.map +1 -0
  11. package/dist/alert-integrity.d.ts +100 -0
  12. package/dist/alert-integrity.d.ts.map +1 -0
  13. package/dist/alert-integrity.js +333 -0
  14. package/dist/alert-integrity.js.map +1 -0
  15. package/dist/alert-preflight.d.ts +40 -0
  16. package/dist/alert-preflight.d.ts.map +1 -0
  17. package/dist/alert-preflight.js +235 -0
  18. package/dist/alert-preflight.js.map +1 -0
  19. package/dist/analytics.d.ts +131 -0
  20. package/dist/analytics.d.ts.map +1 -0
  21. package/dist/analytics.js +371 -0
  22. package/dist/analytics.js.map +1 -0
  23. package/dist/artifact-mirror.d.ts +26 -0
  24. package/dist/artifact-mirror.d.ts.map +1 -0
  25. package/dist/artifact-mirror.js +170 -0
  26. package/dist/artifact-mirror.js.map +1 -0
  27. package/dist/artifact-resolver.d.ts +48 -0
  28. package/dist/artifact-resolver.d.ts.map +1 -0
  29. package/dist/artifact-resolver.js +164 -0
  30. package/dist/artifact-resolver.js.map +1 -0
  31. package/dist/assignment.d.ts +116 -0
  32. package/dist/assignment.d.ts.map +1 -0
  33. package/dist/assignment.js +475 -0
  34. package/dist/assignment.js.map +1 -0
  35. package/dist/auditLedger.d.ts +50 -0
  36. package/dist/auditLedger.d.ts.map +1 -0
  37. package/dist/auditLedger.js +136 -0
  38. package/dist/auditLedger.js.map +1 -0
  39. package/dist/boardHealthWorker.d.ts +134 -0
  40. package/dist/boardHealthWorker.d.ts.map +1 -0
  41. package/dist/boardHealthWorker.js +882 -0
  42. package/dist/boardHealthWorker.js.map +1 -0
  43. package/dist/bootstrap-team.d.ts +42 -0
  44. package/dist/bootstrap-team.d.ts.map +1 -0
  45. package/dist/bootstrap-team.js +111 -0
  46. package/dist/bootstrap-team.js.map +1 -0
  47. package/dist/buildInfo.d.ts +17 -0
  48. package/dist/buildInfo.d.ts.map +1 -0
  49. package/dist/buildInfo.js +56 -0
  50. package/dist/buildInfo.js.map +1 -0
  51. package/dist/calendar-events.d.ts +133 -0
  52. package/dist/calendar-events.d.ts.map +1 -0
  53. package/dist/calendar-events.js +615 -0
  54. package/dist/calendar-events.js.map +1 -0
  55. package/dist/calendar-ical.d.ts +41 -0
  56. package/dist/calendar-ical.d.ts.map +1 -0
  57. package/dist/calendar-ical.js +413 -0
  58. package/dist/calendar-ical.js.map +1 -0
  59. package/dist/calendar-reminder-engine.d.ts +10 -0
  60. package/dist/calendar-reminder-engine.d.ts.map +1 -0
  61. package/dist/calendar-reminder-engine.js +143 -0
  62. package/dist/calendar-reminder-engine.js.map +1 -0
  63. package/dist/calendar.d.ts +75 -0
  64. package/dist/calendar.d.ts.map +1 -0
  65. package/dist/calendar.js +391 -0
  66. package/dist/calendar.js.map +1 -0
  67. package/dist/canvas-multiplexer.d.ts +44 -0
  68. package/dist/canvas-multiplexer.d.ts.map +1 -0
  69. package/dist/canvas-multiplexer.js +150 -0
  70. package/dist/canvas-multiplexer.js.map +1 -0
  71. package/dist/canvas-slots.d.ts +83 -0
  72. package/dist/canvas-slots.d.ts.map +1 -0
  73. package/dist/canvas-slots.js +144 -0
  74. package/dist/canvas-slots.js.map +1 -0
  75. package/dist/canvas-types.d.ts +56 -0
  76. package/dist/canvas-types.d.ts.map +1 -0
  77. package/dist/canvas-types.js +54 -0
  78. package/dist/canvas-types.js.map +1 -0
  79. package/dist/cf-keepalive.d.ts +40 -0
  80. package/dist/cf-keepalive.d.ts.map +1 -0
  81. package/dist/cf-keepalive.js +153 -0
  82. package/dist/cf-keepalive.js.map +1 -0
  83. package/dist/changeFeed.d.ts +38 -0
  84. package/dist/changeFeed.d.ts.map +1 -0
  85. package/dist/changeFeed.js +324 -0
  86. package/dist/changeFeed.js.map +1 -0
  87. package/dist/channels.d.ts +28 -0
  88. package/dist/channels.d.ts.map +1 -0
  89. package/dist/channels.js +23 -0
  90. package/dist/channels.js.map +1 -0
  91. package/dist/chat-approval-detector.d.ts +47 -0
  92. package/dist/chat-approval-detector.d.ts.map +1 -0
  93. package/dist/chat-approval-detector.js +224 -0
  94. package/dist/chat-approval-detector.js.map +1 -0
  95. package/dist/chat.d.ts +119 -0
  96. package/dist/chat.d.ts.map +1 -0
  97. package/dist/chat.js +666 -0
  98. package/dist/chat.js.map +1 -0
  99. package/dist/cli.d.ts +3 -0
  100. package/dist/cli.d.ts.map +1 -0
  101. package/dist/cli.js +1142 -0
  102. package/dist/cli.js.map +1 -0
  103. package/dist/cloud.d.ts +45 -0
  104. package/dist/cloud.d.ts.map +1 -0
  105. package/dist/cloud.js +962 -0
  106. package/dist/cloud.js.map +1 -0
  107. package/dist/config.d.ts +17 -0
  108. package/dist/config.d.ts.map +1 -0
  109. package/dist/config.js +33 -0
  110. package/dist/config.js.map +1 -0
  111. package/dist/connectivity.d.ts +59 -0
  112. package/dist/connectivity.d.ts.map +1 -0
  113. package/dist/connectivity.js +173 -0
  114. package/dist/connectivity.js.map +1 -0
  115. package/dist/contacts.d.ts +59 -0
  116. package/dist/contacts.d.ts.map +1 -0
  117. package/dist/contacts.js +183 -0
  118. package/dist/contacts.js.map +1 -0
  119. package/dist/content.d.ts +130 -0
  120. package/dist/content.d.ts.map +1 -0
  121. package/dist/content.js +186 -0
  122. package/dist/content.js.map +1 -0
  123. package/dist/context-budget.d.ts +87 -0
  124. package/dist/context-budget.d.ts.map +1 -0
  125. package/dist/context-budget.js +459 -0
  126. package/dist/context-budget.js.map +1 -0
  127. package/dist/continuity-loop.d.ts +55 -0
  128. package/dist/continuity-loop.d.ts.map +1 -0
  129. package/dist/continuity-loop.js +267 -0
  130. package/dist/continuity-loop.js.map +1 -0
  131. package/dist/dashboard.d.ts +6 -0
  132. package/dist/dashboard.d.ts.map +1 -0
  133. package/dist/dashboard.js +2348 -0
  134. package/dist/dashboard.js.map +1 -0
  135. package/dist/db.d.ts +44 -0
  136. package/dist/db.d.ts.map +1 -0
  137. package/dist/db.js +648 -0
  138. package/dist/db.js.map +1 -0
  139. package/dist/doctor.d.ts +30 -0
  140. package/dist/doctor.d.ts.map +1 -0
  141. package/dist/doctor.js +159 -0
  142. package/dist/doctor.js.map +1 -0
  143. package/dist/duplicateClosureGuard.d.ts +31 -0
  144. package/dist/duplicateClosureGuard.d.ts.map +1 -0
  145. package/dist/duplicateClosureGuard.js +83 -0
  146. package/dist/duplicateClosureGuard.js.map +1 -0
  147. package/dist/embeddings.d.ts +13 -0
  148. package/dist/embeddings.d.ts.map +1 -0
  149. package/dist/embeddings.js +78 -0
  150. package/dist/embeddings.js.map +1 -0
  151. package/dist/escalation.d.ts +80 -0
  152. package/dist/escalation.d.ts.map +1 -0
  153. package/dist/escalation.js +213 -0
  154. package/dist/escalation.js.map +1 -0
  155. package/dist/events.d.ts +130 -0
  156. package/dist/events.d.ts.map +1 -0
  157. package/dist/events.js +382 -0
  158. package/dist/events.js.map +1 -0
  159. package/dist/executionSweeper.d.ts +97 -0
  160. package/dist/executionSweeper.d.ts.map +1 -0
  161. package/dist/executionSweeper.js +875 -0
  162. package/dist/executionSweeper.js.map +1 -0
  163. package/dist/experiments.d.ts +47 -0
  164. package/dist/experiments.d.ts.map +1 -0
  165. package/dist/experiments.js +133 -0
  166. package/dist/experiments.js.map +1 -0
  167. package/dist/feedback.d.ts +179 -0
  168. package/dist/feedback.d.ts.map +1 -0
  169. package/dist/feedback.js +397 -0
  170. package/dist/feedback.js.map +1 -0
  171. package/dist/files.d.ts +52 -0
  172. package/dist/files.d.ts.map +1 -0
  173. package/dist/files.js +172 -0
  174. package/dist/files.js.map +1 -0
  175. package/dist/format-duration.d.ts +19 -0
  176. package/dist/format-duration.d.ts.map +1 -0
  177. package/dist/format-duration.js +33 -0
  178. package/dist/format-duration.js.map +1 -0
  179. package/dist/github-actor-auth.d.ts +20 -0
  180. package/dist/github-actor-auth.d.ts.map +1 -0
  181. package/dist/github-actor-auth.js +54 -0
  182. package/dist/github-actor-auth.js.map +1 -0
  183. package/dist/github-ci.d.ts +16 -0
  184. package/dist/github-ci.d.ts.map +1 -0
  185. package/dist/github-ci.js +37 -0
  186. package/dist/github-ci.js.map +1 -0
  187. package/dist/github-identity.d.ts +30 -0
  188. package/dist/github-identity.d.ts.map +1 -0
  189. package/dist/github-identity.js +96 -0
  190. package/dist/github-identity.js.map +1 -0
  191. package/dist/github-reviews.d.ts +24 -0
  192. package/dist/github-reviews.d.ts.map +1 -0
  193. package/dist/github-reviews.js +56 -0
  194. package/dist/github-reviews.js.map +1 -0
  195. package/dist/health.d.ts +391 -0
  196. package/dist/health.d.ts.map +1 -0
  197. package/dist/health.js +1841 -0
  198. package/dist/health.js.map +1 -0
  199. package/dist/host-keepalive.d.ts +22 -0
  200. package/dist/host-keepalive.d.ts.map +1 -0
  201. package/dist/host-keepalive.js +126 -0
  202. package/dist/host-keepalive.js.map +1 -0
  203. package/dist/host-registry.d.ts +43 -0
  204. package/dist/host-registry.d.ts.map +1 -0
  205. package/dist/host-registry.js +93 -0
  206. package/dist/host-registry.js.map +1 -0
  207. package/dist/inbox.d.ts +87 -0
  208. package/dist/inbox.d.ts.map +1 -0
  209. package/dist/inbox.js +410 -0
  210. package/dist/inbox.js.map +1 -0
  211. package/dist/index.d.ts +2 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +306 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/insight-mutation.d.ts +32 -0
  216. package/dist/insight-mutation.d.ts.map +1 -0
  217. package/dist/insight-mutation.js +160 -0
  218. package/dist/insight-mutation.js.map +1 -0
  219. package/dist/insight-promotion.d.ts +89 -0
  220. package/dist/insight-promotion.d.ts.map +1 -0
  221. package/dist/insight-promotion.js +278 -0
  222. package/dist/insight-promotion.js.map +1 -0
  223. package/dist/insight-task-bridge.d.ts +77 -0
  224. package/dist/insight-task-bridge.d.ts.map +1 -0
  225. package/dist/insight-task-bridge.js +556 -0
  226. package/dist/insight-task-bridge.js.map +1 -0
  227. package/dist/insights.d.ts +222 -0
  228. package/dist/insights.d.ts.map +1 -0
  229. package/dist/insights.js +871 -0
  230. package/dist/insights.js.map +1 -0
  231. package/dist/intake-pipeline.d.ts +74 -0
  232. package/dist/intake-pipeline.d.ts.map +1 -0
  233. package/dist/intake-pipeline.js +199 -0
  234. package/dist/intake-pipeline.js.map +1 -0
  235. package/dist/intensity.d.ts +31 -0
  236. package/dist/intensity.d.ts.map +1 -0
  237. package/dist/intensity.js +94 -0
  238. package/dist/intensity.js.map +1 -0
  239. package/dist/knowledge-auto-index.d.ts +37 -0
  240. package/dist/knowledge-auto-index.d.ts.map +1 -0
  241. package/dist/knowledge-auto-index.js +149 -0
  242. package/dist/knowledge-auto-index.js.map +1 -0
  243. package/dist/knowledge-docs.d.ts +45 -0
  244. package/dist/knowledge-docs.d.ts.map +1 -0
  245. package/dist/knowledge-docs.js +188 -0
  246. package/dist/knowledge-docs.js.map +1 -0
  247. package/dist/lane-config.d.ts +25 -0
  248. package/dist/lane-config.d.ts.map +1 -0
  249. package/dist/lane-config.js +105 -0
  250. package/dist/lane-config.js.map +1 -0
  251. package/dist/lineage.d.ts +86 -0
  252. package/dist/lineage.d.ts.map +1 -0
  253. package/dist/lineage.js +303 -0
  254. package/dist/lineage.js.map +1 -0
  255. package/dist/logStore.d.ts +25 -0
  256. package/dist/logStore.d.ts.map +1 -0
  257. package/dist/logStore.js +83 -0
  258. package/dist/logStore.js.map +1 -0
  259. package/dist/manage.d.ts +12 -0
  260. package/dist/manage.d.ts.map +1 -0
  261. package/dist/manage.js +253 -0
  262. package/dist/manage.js.map +1 -0
  263. package/dist/mcp.d.ts +5 -0
  264. package/dist/mcp.d.ts.map +1 -0
  265. package/dist/mcp.js +604 -0
  266. package/dist/mcp.js.map +1 -0
  267. package/dist/memory.d.ts +47 -0
  268. package/dist/memory.d.ts.map +1 -0
  269. package/dist/memory.js +149 -0
  270. package/dist/memory.js.map +1 -0
  271. package/dist/mention-ack.d.ts +80 -0
  272. package/dist/mention-ack.d.ts.map +1 -0
  273. package/dist/mention-ack.js +175 -0
  274. package/dist/mention-ack.js.map +1 -0
  275. package/dist/messageRouter.d.ts +60 -0
  276. package/dist/messageRouter.d.ts.map +1 -0
  277. package/dist/messageRouter.js +309 -0
  278. package/dist/messageRouter.js.map +1 -0
  279. package/dist/mutationAlert.d.ts +44 -0
  280. package/dist/mutationAlert.d.ts.map +1 -0
  281. package/dist/mutationAlert.js +174 -0
  282. package/dist/mutationAlert.js.map +1 -0
  283. package/dist/noise-budget.d.ts +136 -0
  284. package/dist/noise-budget.d.ts.map +1 -0
  285. package/dist/noise-budget.js +340 -0
  286. package/dist/noise-budget.js.map +1 -0
  287. package/dist/notifications.d.ts +67 -0
  288. package/dist/notifications.d.ts.map +1 -0
  289. package/dist/notifications.js +253 -0
  290. package/dist/notifications.js.map +1 -0
  291. package/dist/openclaw.d.ts +34 -0
  292. package/dist/openclaw.d.ts.map +1 -0
  293. package/dist/openclaw.js +208 -0
  294. package/dist/openclaw.js.map +1 -0
  295. package/dist/pause-controls.d.ts +31 -0
  296. package/dist/pause-controls.d.ts.map +1 -0
  297. package/dist/pause-controls.js +130 -0
  298. package/dist/pause-controls.js.map +1 -0
  299. package/dist/pidlock.d.ts +25 -0
  300. package/dist/pidlock.d.ts.map +1 -0
  301. package/dist/pidlock.js +179 -0
  302. package/dist/pidlock.js.map +1 -0
  303. package/dist/policy.d.ts +139 -0
  304. package/dist/policy.d.ts.map +1 -0
  305. package/dist/policy.js +264 -0
  306. package/dist/policy.js.map +1 -0
  307. package/dist/polls.d.ts +47 -0
  308. package/dist/polls.d.ts.map +1 -0
  309. package/dist/polls.js +162 -0
  310. package/dist/polls.js.map +1 -0
  311. package/dist/portability.d.ts +55 -0
  312. package/dist/portability.d.ts.map +1 -0
  313. package/dist/portability.js +292 -0
  314. package/dist/portability.js.map +1 -0
  315. package/dist/pr-integrity.d.ts +45 -0
  316. package/dist/pr-integrity.d.ts.map +1 -0
  317. package/dist/pr-integrity.js +124 -0
  318. package/dist/pr-integrity.js.map +1 -0
  319. package/dist/prAutoMerge.d.ts +62 -0
  320. package/dist/prAutoMerge.d.ts.map +1 -0
  321. package/dist/prAutoMerge.js +493 -0
  322. package/dist/prAutoMerge.js.map +1 -0
  323. package/dist/preflight.d.ts +66 -0
  324. package/dist/preflight.d.ts.map +1 -0
  325. package/dist/preflight.js +864 -0
  326. package/dist/preflight.js.map +1 -0
  327. package/dist/presence.d.ts +98 -0
  328. package/dist/presence.d.ts.map +1 -0
  329. package/dist/presence.js +347 -0
  330. package/dist/presence.js.map +1 -0
  331. package/dist/provisioning.d.ts +101 -0
  332. package/dist/provisioning.d.ts.map +1 -0
  333. package/dist/provisioning.js +430 -0
  334. package/dist/provisioning.js.map +1 -0
  335. package/dist/reflection-automation.d.ts +59 -0
  336. package/dist/reflection-automation.d.ts.map +1 -0
  337. package/dist/reflection-automation.js +350 -0
  338. package/dist/reflection-automation.js.map +1 -0
  339. package/dist/reflections.d.ts +65 -0
  340. package/dist/reflections.d.ts.map +1 -0
  341. package/dist/reflections.js +306 -0
  342. package/dist/reflections.js.map +1 -0
  343. package/dist/release.d.ts +67 -0
  344. package/dist/release.d.ts.map +1 -0
  345. package/dist/release.js +275 -0
  346. package/dist/release.js.map +1 -0
  347. package/dist/request-tracker.d.ts +36 -0
  348. package/dist/request-tracker.d.ts.map +1 -0
  349. package/dist/request-tracker.js +109 -0
  350. package/dist/request-tracker.js.map +1 -0
  351. package/dist/research.d.ts +75 -0
  352. package/dist/research.d.ts.map +1 -0
  353. package/dist/research.js +171 -0
  354. package/dist/research.js.map +1 -0
  355. package/dist/routing-approvals.d.ts +73 -0
  356. package/dist/routing-approvals.d.ts.map +1 -0
  357. package/dist/routing-approvals.js +88 -0
  358. package/dist/routing-approvals.js.map +1 -0
  359. package/dist/routing-override.d.ts +94 -0
  360. package/dist/routing-override.d.ts.map +1 -0
  361. package/dist/routing-override.js +290 -0
  362. package/dist/routing-override.js.map +1 -0
  363. package/dist/scope-routing.d.ts +18 -0
  364. package/dist/scope-routing.d.ts.map +1 -0
  365. package/dist/scope-routing.js +29 -0
  366. package/dist/scope-routing.js.map +1 -0
  367. package/dist/secrets.d.ts +77 -0
  368. package/dist/secrets.d.ts.map +1 -0
  369. package/dist/secrets.js +287 -0
  370. package/dist/secrets.js.map +1 -0
  371. package/dist/server.d.ts +3 -0
  372. package/dist/server.d.ts.map +1 -0
  373. package/dist/server.js +10887 -0
  374. package/dist/server.js.map +1 -0
  375. package/dist/service-probe.d.ts +53 -0
  376. package/dist/service-probe.d.ts.map +1 -0
  377. package/dist/service-probe.js +225 -0
  378. package/dist/service-probe.js.map +1 -0
  379. package/dist/shared-workspace-api.d.ts +73 -0
  380. package/dist/shared-workspace-api.d.ts.map +1 -0
  381. package/dist/shared-workspace-api.js +281 -0
  382. package/dist/shared-workspace-api.js.map +1 -0
  383. package/dist/shipped-heartbeat.d.ts +91 -0
  384. package/dist/shipped-heartbeat.d.ts.map +1 -0
  385. package/dist/shipped-heartbeat.js +272 -0
  386. package/dist/shipped-heartbeat.js.map +1 -0
  387. package/dist/starter-team.d.ts +23 -0
  388. package/dist/starter-team.d.ts.map +1 -0
  389. package/dist/starter-team.js +88 -0
  390. package/dist/starter-team.js.map +1 -0
  391. package/dist/suppression-ledger.d.ts +73 -0
  392. package/dist/suppression-ledger.d.ts.map +1 -0
  393. package/dist/suppression-ledger.js +125 -0
  394. package/dist/suppression-ledger.js.map +1 -0
  395. package/dist/system-loop-state.d.ts +4 -0
  396. package/dist/system-loop-state.d.ts.map +1 -0
  397. package/dist/system-loop-state.js +40 -0
  398. package/dist/system-loop-state.js.map +1 -0
  399. package/dist/taskCommentIngest.d.ts +43 -0
  400. package/dist/taskCommentIngest.d.ts.map +1 -0
  401. package/dist/taskCommentIngest.js +59 -0
  402. package/dist/taskCommentIngest.js.map +1 -0
  403. package/dist/taskPrecheck.d.ts +20 -0
  404. package/dist/taskPrecheck.d.ts.map +1 -0
  405. package/dist/taskPrecheck.js +329 -0
  406. package/dist/taskPrecheck.js.map +1 -0
  407. package/dist/taskStateSync.d.ts +8 -0
  408. package/dist/taskStateSync.d.ts.map +1 -0
  409. package/dist/taskStateSync.js +79 -0
  410. package/dist/taskStateSync.js.map +1 -0
  411. package/dist/tasks.d.ts +140 -0
  412. package/dist/tasks.d.ts.map +1 -0
  413. package/dist/tasks.js +1281 -0
  414. package/dist/tasks.js.map +1 -0
  415. package/dist/team-config.d.ts +24 -0
  416. package/dist/team-config.d.ts.map +1 -0
  417. package/dist/team-config.js +221 -0
  418. package/dist/team-config.js.map +1 -0
  419. package/dist/team-doctor.d.ts +22 -0
  420. package/dist/team-doctor.d.ts.map +1 -0
  421. package/dist/team-doctor.js +270 -0
  422. package/dist/team-doctor.js.map +1 -0
  423. package/dist/team-pulse.d.ts +52 -0
  424. package/dist/team-pulse.d.ts.map +1 -0
  425. package/dist/team-pulse.js +176 -0
  426. package/dist/team-pulse.js.map +1 -0
  427. package/dist/telemetry.d.ts +74 -0
  428. package/dist/telemetry.d.ts.map +1 -0
  429. package/dist/telemetry.js +256 -0
  430. package/dist/telemetry.js.map +1 -0
  431. package/dist/test-task-filter.d.ts +21 -0
  432. package/dist/test-task-filter.d.ts.map +1 -0
  433. package/dist/test-task-filter.js +48 -0
  434. package/dist/test-task-filter.js.map +1 -0
  435. package/dist/types.d.ts +126 -0
  436. package/dist/types.d.ts.map +1 -0
  437. package/dist/types.js +4 -0
  438. package/dist/types.js.map +1 -0
  439. package/dist/usage-tracking.d.ts +101 -0
  440. package/dist/usage-tracking.d.ts.map +1 -0
  441. package/dist/usage-tracking.js +325 -0
  442. package/dist/usage-tracking.js.map +1 -0
  443. package/dist/vector-store.d.ts +87 -0
  444. package/dist/vector-store.d.ts.map +1 -0
  445. package/dist/vector-store.js +247 -0
  446. package/dist/vector-store.js.map +1 -0
  447. package/dist/watchdog/idleNudgeLane.d.ts +22 -0
  448. package/dist/watchdog/idleNudgeLane.d.ts.map +1 -0
  449. package/dist/watchdog/idleNudgeLane.js +98 -0
  450. package/dist/watchdog/idleNudgeLane.js.map +1 -0
  451. package/dist/webhooks.d.ts +103 -0
  452. package/dist/webhooks.d.ts.map +1 -0
  453. package/dist/webhooks.js +398 -0
  454. package/dist/webhooks.js.map +1 -0
  455. package/dist/working-contract.d.ts +42 -0
  456. package/dist/working-contract.d.ts.map +1 -0
  457. package/dist/working-contract.js +228 -0
  458. package/dist/working-contract.js.map +1 -0
  459. package/dist/ws-heartbeat.d.ts +66 -0
  460. package/dist/ws-heartbeat.d.ts.map +1 -0
  461. package/dist/ws-heartbeat.js +174 -0
  462. package/dist/ws-heartbeat.js.map +1 -0
  463. package/package.json +87 -0
  464. package/plugins/reflectt-channel/README.md +96 -0
  465. package/plugins/reflectt-channel/index.ts +789 -0
  466. package/plugins/reflectt-channel/openclaw.plugin.json +23 -0
  467. package/plugins/reflectt-channel/package.json +23 -0
  468. package/plugins/reflectt-channel/src/channel.ts +433 -0
  469. package/plugins/reflectt-channel/src/types.ts +29 -0
  470. package/public/avatars/echo.png +0 -0
  471. package/public/avatars/harmony.png +0 -0
  472. package/public/avatars/kai.png +0 -0
  473. package/public/avatars/link.png +0 -0
  474. package/public/avatars/pixel.png +0 -0
  475. package/public/avatars/rhythm.png +0 -0
  476. package/public/avatars/ryan.png +0 -0
  477. package/public/avatars/sage.png +0 -0
  478. package/public/avatars/scout.png +0 -0
  479. package/public/avatars/spark.png +0 -0
  480. package/public/dashboard-animations.css +381 -0
  481. package/public/dashboard.js +3479 -0
  482. package/public/docs.md +1062 -0
  483. package/public/file-upload-mock.html +1097 -0
  484. package/public/og-card.png +0 -0
  485. package/public/ui-kit.html +318 -0
  486. package/public/widget/feedback.js +194 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type IdleNudgeLaneReason = 'no-active-lane' | 'stale-lane' | 'ambiguous-lane' | 'presence-task-mismatch' | 'ok';
2
+ export type IdleNudgeLaneTask = {
3
+ id: string;
4
+ assignee?: string;
5
+ status?: string;
6
+ createdAt?: number;
7
+ updatedAt?: number;
8
+ /** Canonical activity signal — if set, used instead of updatedAt for stale detection */
9
+ effectiveActivityTs?: number;
10
+ };
11
+ export type IdleNudgeLaneState = {
12
+ presenceTaskId: string | null;
13
+ doingTaskIds: string[];
14
+ freshDoingTaskIds: string[];
15
+ staleDoingTaskIds: string[];
16
+ selectedTaskId: string | null;
17
+ selectedTaskAgeMin: number | null;
18
+ laneReason: IdleNudgeLaneReason;
19
+ };
20
+ export declare function normalizeTaskId(value: unknown): string | null;
21
+ export declare function resolveIdleNudgeLane(agent: string, presenceTaskRaw: unknown, tasks: IdleNudgeLaneTask[], now: number, activeTaskMaxAgeMin: number): IdleNudgeLaneState;
22
+ //# sourceMappingURL=idleNudgeLane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idleNudgeLane.d.ts","sourceRoot":"","sources":["../../src/watchdog/idleNudgeLane.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,mBAAmB,GAC3B,gBAAgB,GAChB,YAAY,GACZ,gBAAgB,GAChB,wBAAwB,GACxB,IAAI,CAAA;AAER,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,EAAE,mBAAmB,CAAA;CAChC,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI7D;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,OAAO,EACxB,KAAK,EAAE,iBAAiB,EAAE,EAC1B,GAAG,EAAE,MAAM,EACX,mBAAmB,EAAE,MAAM,GAC1B,kBAAkB,CA+FpB"}
@@ -0,0 +1,98 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) Reflectt AI
3
+ export function normalizeTaskId(value) {
4
+ const taskId = typeof value === 'string' ? value.trim() : '';
5
+ if (!taskId)
6
+ return null;
7
+ return /^task-[a-z0-9-]+$/i.test(taskId) ? taskId : null;
8
+ }
9
+ export function resolveIdleNudgeLane(agent, presenceTaskRaw, tasks, now, activeTaskMaxAgeMin) {
10
+ const presenceTaskId = normalizeTaskId(presenceTaskRaw);
11
+ const doingTasks = tasks
12
+ .filter((t) => (t.assignee || '').toLowerCase() === agent && t.status === 'doing')
13
+ .sort((a, b) => {
14
+ const aTs = Number(a.effectiveActivityTs || a.updatedAt || a.createdAt || 0);
15
+ const bTs = Number(b.effectiveActivityTs || b.updatedAt || b.createdAt || 0);
16
+ return bTs - aTs;
17
+ });
18
+ const doingTaskIds = doingTasks
19
+ .map(t => normalizeTaskId(t.id))
20
+ .filter((id) => Boolean(id));
21
+ const staleDoingTaskIds = [];
22
+ const freshDoingTaskIds = [];
23
+ for (const task of doingTasks) {
24
+ const taskId = normalizeTaskId(task.id);
25
+ if (!taskId)
26
+ continue;
27
+ const taskActivityAt = Number(task.effectiveActivityTs || task.updatedAt || task.createdAt || 0);
28
+ const taskAgeMin = taskActivityAt > 0 ? Math.floor((now - taskActivityAt) / 60_000) : Number.MAX_SAFE_INTEGER;
29
+ if (taskAgeMin > activeTaskMaxAgeMin) {
30
+ staleDoingTaskIds.push(taskId);
31
+ }
32
+ else {
33
+ freshDoingTaskIds.push(taskId);
34
+ }
35
+ }
36
+ const selectedTaskId = freshDoingTaskIds[0] || null;
37
+ const selectedTask = selectedTaskId
38
+ ? doingTasks.find((task) => task.id === selectedTaskId)
39
+ : null;
40
+ const selectedTaskActivityAt = Number(selectedTask?.effectiveActivityTs || selectedTask?.updatedAt || selectedTask?.createdAt || 0);
41
+ const selectedTaskAgeMin = selectedTaskActivityAt > 0
42
+ ? Math.floor((now - selectedTaskActivityAt) / 60_000)
43
+ : null;
44
+ if (freshDoingTaskIds.length === 0) {
45
+ if (doingTaskIds.length === 0) {
46
+ return {
47
+ presenceTaskId,
48
+ doingTaskIds,
49
+ freshDoingTaskIds,
50
+ staleDoingTaskIds,
51
+ selectedTaskId: null,
52
+ selectedTaskAgeMin: null,
53
+ laneReason: 'no-active-lane',
54
+ };
55
+ }
56
+ return {
57
+ presenceTaskId,
58
+ doingTaskIds,
59
+ freshDoingTaskIds,
60
+ staleDoingTaskIds,
61
+ selectedTaskId: null,
62
+ selectedTaskAgeMin: null,
63
+ laneReason: 'stale-lane',
64
+ };
65
+ }
66
+ if (freshDoingTaskIds.length > 1) {
67
+ return {
68
+ presenceTaskId,
69
+ doingTaskIds,
70
+ freshDoingTaskIds,
71
+ staleDoingTaskIds,
72
+ selectedTaskId,
73
+ selectedTaskAgeMin,
74
+ laneReason: 'ambiguous-lane',
75
+ };
76
+ }
77
+ if (presenceTaskId && selectedTaskId && presenceTaskId !== selectedTaskId) {
78
+ return {
79
+ presenceTaskId,
80
+ doingTaskIds,
81
+ freshDoingTaskIds,
82
+ staleDoingTaskIds,
83
+ selectedTaskId,
84
+ selectedTaskAgeMin,
85
+ laneReason: 'presence-task-mismatch',
86
+ };
87
+ }
88
+ return {
89
+ presenceTaskId,
90
+ doingTaskIds,
91
+ freshDoingTaskIds,
92
+ staleDoingTaskIds,
93
+ selectedTaskId,
94
+ selectedTaskAgeMin,
95
+ laneReason: 'ok',
96
+ };
97
+ }
98
+ //# sourceMappingURL=idleNudgeLane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idleNudgeLane.js","sourceRoot":"","sources":["../../src/watchdog/idleNudgeLane.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,4BAA4B;AA6B5B,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,eAAwB,EACxB,KAA0B,EAC1B,GAAW,EACX,mBAA2B;IAE3B,MAAM,cAAc,GAAG,eAAe,CAAC,eAAe,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,KAAK;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;SACjF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAA;QAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAA;QAC5E,OAAO,GAAG,GAAG,GAAG,CAAA;IAClB,CAAC,CAAC,CAAA;IAEJ,MAAM,YAAY,GAAG,UAAU;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;IAE5C,MAAM,iBAAiB,GAAa,EAAE,CAAA;IACtC,MAAM,iBAAiB,GAAa,EAAE,CAAA;IAEtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAA;QAChG,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAA;QAC7G,IAAI,UAAU,GAAG,mBAAmB,EAAE,CAAC;YACrC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IACnD,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,CAAC;QACvD,CAAC,CAAC,IAAI,CAAA;IACR,MAAM,sBAAsB,GAAG,MAAM,CAAC,YAAY,EAAE,mBAAmB,IAAI,YAAY,EAAE,SAAS,IAAI,YAAY,EAAE,SAAS,IAAI,CAAC,CAAC,CAAA;IACnI,MAAM,kBAAkB,GAAG,sBAAsB,GAAG,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,sBAAsB,CAAC,GAAG,MAAM,CAAC;QACrD,CAAC,CAAC,IAAI,CAAA;IAER,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,cAAc;gBACd,YAAY;gBACZ,iBAAiB;gBACjB,iBAAiB;gBACjB,cAAc,EAAE,IAAI;gBACpB,kBAAkB,EAAE,IAAI;gBACxB,UAAU,EAAE,gBAAgB;aAC7B,CAAA;QACH,CAAC;QAED,OAAO;YACL,cAAc;YACd,YAAY;YACZ,iBAAiB;YACjB,iBAAiB;YACjB,cAAc,EAAE,IAAI;YACpB,kBAAkB,EAAE,IAAI;YACxB,UAAU,EAAE,YAAY;SACzB,CAAA;IACH,CAAC;IAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,cAAc;YACd,YAAY;YACZ,iBAAiB;YACjB,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,UAAU,EAAE,gBAAgB;SAC7B,CAAA;IACH,CAAC;IAED,IAAI,cAAc,IAAI,cAAc,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;QAC1E,OAAO;YACL,cAAc;YACd,YAAY;YACZ,iBAAiB;YACjB,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,UAAU,EAAE,wBAAwB;SACrC,CAAA;IACH,CAAC;IAED,OAAO;QACL,cAAc;QACd,YAAY;QACZ,iBAAiB;QACjB,iBAAiB;QACjB,cAAc;QACd,kBAAkB;QAClB,UAAU,EAAE,IAAI;KACjB,CAAA;AACH,CAAC"}
@@ -0,0 +1,103 @@
1
+ export type WebhookStatus = 'pending' | 'delivering' | 'delivered' | 'retrying' | 'dead_letter';
2
+ export interface WebhookEvent {
3
+ id: string;
4
+ idempotencyKey: string;
5
+ provider: string;
6
+ eventType: string;
7
+ payload: string;
8
+ targetUrl: string;
9
+ status: WebhookStatus;
10
+ attempts: number;
11
+ maxAttempts: number;
12
+ nextRetryAt: number | null;
13
+ lastAttemptAt: number | null;
14
+ lastError: string | null;
15
+ lastStatusCode: number | null;
16
+ deliveredAt: number | null;
17
+ createdAt: number;
18
+ expiresAt: number;
19
+ metadata?: string;
20
+ }
21
+ export interface WebhookDeliveryResult {
22
+ success: boolean;
23
+ statusCode: number | null;
24
+ error: string | null;
25
+ duration: number;
26
+ }
27
+ export interface WebhookStats {
28
+ total: number;
29
+ pending: number;
30
+ delivering: number;
31
+ delivered: number;
32
+ retrying: number;
33
+ deadLetter: number;
34
+ oldestPending: number | null;
35
+ }
36
+ export interface WebhookConfig {
37
+ maxAttempts: number;
38
+ initialBackoffMs: number;
39
+ maxBackoffMs: number;
40
+ backoffMultiplier: number;
41
+ retentionMs: number;
42
+ deliveryTimeoutMs: number;
43
+ maxConcurrent: number;
44
+ }
45
+ export declare class WebhookDeliveryManager {
46
+ private config;
47
+ private retryTimer;
48
+ private cleanupTimer;
49
+ private activeDeliveries;
50
+ private initialized;
51
+ constructor(config?: Partial<WebhookConfig>);
52
+ /** Initialize database tables and start background loops */
53
+ init(): void;
54
+ /** Stop background loops */
55
+ stop(): void;
56
+ /**
57
+ * Enqueue a webhook for delivery.
58
+ * Returns the webhook event with idempotency key.
59
+ */
60
+ enqueue(params: {
61
+ provider: string;
62
+ eventType: string;
63
+ payload: unknown;
64
+ targetUrl: string;
65
+ idempotencyKey?: string;
66
+ metadata?: Record<string, unknown>;
67
+ maxAttempts?: number;
68
+ retentionMs?: number;
69
+ }): WebhookEvent;
70
+ /** Get a webhook event by ID */
71
+ get(id: string): WebhookEvent | null;
72
+ /** Get a webhook event by idempotency key */
73
+ getByIdempotencyKey(key: string): WebhookEvent | null;
74
+ /** List webhook events with filters */
75
+ list(params?: {
76
+ status?: WebhookStatus;
77
+ provider?: string;
78
+ limit?: number;
79
+ offset?: number;
80
+ }): WebhookEvent[];
81
+ /** Get dead letter queue entries */
82
+ getDeadLetterQueue(limit?: number): WebhookEvent[];
83
+ /**
84
+ * Replay a webhook: re-enqueue for delivery with a new idempotency key.
85
+ * Original event is preserved in the audit trail.
86
+ */
87
+ replay(id: string): WebhookEvent | null;
88
+ /** Get delivery statistics */
89
+ getStats(): WebhookStats;
90
+ /** Get delivery config */
91
+ getConfig(): WebhookConfig;
92
+ /** Update delivery config */
93
+ updateConfig(patch: Partial<WebhookConfig>): WebhookConfig;
94
+ private deliverAsync;
95
+ private deliver;
96
+ private attemptDelivery;
97
+ private calculateBackoff;
98
+ private processRetries;
99
+ private purgeExpired;
100
+ private rowToEvent;
101
+ }
102
+ export declare function getWebhookDeliveryManager(config?: Partial<WebhookConfig>): WebhookDeliveryManager;
103
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,398 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) Reflectt AI
3
+ /**
4
+ * Webhook Delivery Engine
5
+ *
6
+ * Durable webhook delivery with:
7
+ * - Idempotency keys (UUID per delivery attempt)
8
+ * - Exponential backoff retries (configurable max attempts)
9
+ * - Dead letter queue for permanently failed deliveries
10
+ * - Replay: resend any webhook from the audit trail
11
+ * - TTL-based payload retention with configurable window
12
+ * - SQLite-backed persistence
13
+ */
14
+ import { randomUUID } from 'node:crypto';
15
+ import { getDb } from './db.js';
16
+ // ── Constants ──
17
+ const DEFAULT_CONFIG = {
18
+ maxAttempts: 5,
19
+ initialBackoffMs: 1_000, // 1s
20
+ maxBackoffMs: 300_000, // 5 minutes
21
+ backoffMultiplier: 2,
22
+ retentionMs: 7 * 24 * 60 * 60 * 1000, // 7 days
23
+ deliveryTimeoutMs: 30_000, // 30s
24
+ maxConcurrent: 10,
25
+ };
26
+ // ── Schema ──
27
+ const CREATE_TABLE = `
28
+ CREATE TABLE IF NOT EXISTS webhook_events (
29
+ id TEXT PRIMARY KEY,
30
+ idempotency_key TEXT UNIQUE NOT NULL,
31
+ provider TEXT NOT NULL,
32
+ event_type TEXT NOT NULL,
33
+ payload TEXT NOT NULL,
34
+ target_url TEXT NOT NULL,
35
+ status TEXT NOT NULL DEFAULT 'pending',
36
+ attempts INTEGER NOT NULL DEFAULT 0,
37
+ max_attempts INTEGER NOT NULL DEFAULT 5,
38
+ next_retry_at INTEGER,
39
+ last_attempt_at INTEGER,
40
+ last_error TEXT,
41
+ last_status_code INTEGER,
42
+ delivered_at INTEGER,
43
+ created_at INTEGER NOT NULL,
44
+ expires_at INTEGER NOT NULL,
45
+ metadata TEXT
46
+ )
47
+ `;
48
+ const CREATE_INDEXES = [
49
+ 'CREATE INDEX IF NOT EXISTS idx_webhook_status ON webhook_events(status)',
50
+ 'CREATE INDEX IF NOT EXISTS idx_webhook_next_retry ON webhook_events(next_retry_at)',
51
+ 'CREATE INDEX IF NOT EXISTS idx_webhook_provider ON webhook_events(provider)',
52
+ 'CREATE INDEX IF NOT EXISTS idx_webhook_expires ON webhook_events(expires_at)',
53
+ 'CREATE INDEX IF NOT EXISTS idx_webhook_idempotency ON webhook_events(idempotency_key)',
54
+ ];
55
+ // ── Webhook Delivery Manager ──
56
+ export class WebhookDeliveryManager {
57
+ config;
58
+ retryTimer = null;
59
+ cleanupTimer = null;
60
+ activeDeliveries = 0;
61
+ initialized = false;
62
+ constructor(config = {}) {
63
+ this.config = { ...DEFAULT_CONFIG, ...config };
64
+ }
65
+ /** Initialize database tables and start background loops */
66
+ init() {
67
+ if (this.initialized)
68
+ return;
69
+ const db = getDb();
70
+ db.exec(CREATE_TABLE);
71
+ for (const idx of CREATE_INDEXES) {
72
+ db.exec(idx);
73
+ }
74
+ // Retry loop: check for retryable webhooks every 5s
75
+ this.retryTimer = setInterval(() => {
76
+ this.processRetries().catch(err => {
77
+ console.error('[Webhooks] Retry loop error:', err.message);
78
+ });
79
+ }, 5_000);
80
+ this.retryTimer.unref();
81
+ // Cleanup loop: purge expired payloads every hour
82
+ this.cleanupTimer = setInterval(() => {
83
+ this.purgeExpired();
84
+ }, 60 * 60 * 1000);
85
+ this.cleanupTimer.unref();
86
+ this.initialized = true;
87
+ console.log('[Webhooks] Delivery engine initialized');
88
+ }
89
+ /** Stop background loops */
90
+ stop() {
91
+ if (this.retryTimer) {
92
+ clearInterval(this.retryTimer);
93
+ this.retryTimer = null;
94
+ }
95
+ if (this.cleanupTimer) {
96
+ clearInterval(this.cleanupTimer);
97
+ this.cleanupTimer = null;
98
+ }
99
+ }
100
+ /**
101
+ * Enqueue a webhook for delivery.
102
+ * Returns the webhook event with idempotency key.
103
+ */
104
+ enqueue(params) {
105
+ const now = Date.now();
106
+ const id = `whe_${randomUUID().replace(/-/g, '').slice(0, 16)}`;
107
+ const idempotencyKey = params.idempotencyKey || `idk_${randomUUID()}`;
108
+ const maxAttempts = params.maxAttempts ?? this.config.maxAttempts;
109
+ const retentionMs = params.retentionMs ?? this.config.retentionMs;
110
+ const db = getDb();
111
+ // Check idempotency — if key exists, return existing event
112
+ const existing = db.prepare('SELECT * FROM webhook_events WHERE idempotency_key = ?').get(idempotencyKey);
113
+ if (existing) {
114
+ return this.rowToEvent(existing);
115
+ }
116
+ const payloadStr = typeof params.payload === 'string'
117
+ ? params.payload
118
+ : JSON.stringify(params.payload);
119
+ const metadataStr = params.metadata ? JSON.stringify(params.metadata) : null;
120
+ db.prepare(`
121
+ INSERT INTO webhook_events (
122
+ id, idempotency_key, provider, event_type, payload, target_url,
123
+ status, attempts, max_attempts, next_retry_at,
124
+ created_at, expires_at, metadata
125
+ ) VALUES (?, ?, ?, ?, ?, ?, 'pending', 0, ?, NULL, ?, ?, ?)
126
+ `).run(id, idempotencyKey, params.provider, params.eventType, payloadStr, params.targetUrl, maxAttempts, now, now + retentionMs, metadataStr);
127
+ const event = {
128
+ id,
129
+ idempotencyKey,
130
+ provider: params.provider,
131
+ eventType: params.eventType,
132
+ payload: payloadStr,
133
+ targetUrl: params.targetUrl,
134
+ status: 'pending',
135
+ attempts: 0,
136
+ maxAttempts,
137
+ nextRetryAt: null,
138
+ lastAttemptAt: null,
139
+ lastError: null,
140
+ lastStatusCode: null,
141
+ deliveredAt: null,
142
+ createdAt: now,
143
+ expiresAt: now + retentionMs,
144
+ metadata: metadataStr ?? undefined,
145
+ };
146
+ // Attempt immediate delivery
147
+ this.deliverAsync(event);
148
+ return event;
149
+ }
150
+ /** Get a webhook event by ID */
151
+ get(id) {
152
+ const db = getDb();
153
+ const row = db.prepare('SELECT * FROM webhook_events WHERE id = ?').get(id);
154
+ return row ? this.rowToEvent(row) : null;
155
+ }
156
+ /** Get a webhook event by idempotency key */
157
+ getByIdempotencyKey(key) {
158
+ const db = getDb();
159
+ const row = db.prepare('SELECT * FROM webhook_events WHERE idempotency_key = ?').get(key);
160
+ return row ? this.rowToEvent(row) : null;
161
+ }
162
+ /** List webhook events with filters */
163
+ list(params = {}) {
164
+ const db = getDb();
165
+ const conditions = [];
166
+ const values = [];
167
+ if (params.status) {
168
+ conditions.push('status = ?');
169
+ values.push(params.status);
170
+ }
171
+ if (params.provider) {
172
+ conditions.push('provider = ?');
173
+ values.push(params.provider);
174
+ }
175
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
176
+ const limit = params.limit ?? 50;
177
+ const offset = params.offset ?? 0;
178
+ const rows = db.prepare(`SELECT * FROM webhook_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).all(...values, limit, offset);
179
+ return rows.map(r => this.rowToEvent(r));
180
+ }
181
+ /** Get dead letter queue entries */
182
+ getDeadLetterQueue(limit = 50) {
183
+ return this.list({ status: 'dead_letter', limit });
184
+ }
185
+ /**
186
+ * Replay a webhook: re-enqueue for delivery with a new idempotency key.
187
+ * Original event is preserved in the audit trail.
188
+ */
189
+ replay(id) {
190
+ const original = this.get(id);
191
+ if (!original)
192
+ return null;
193
+ // Create new event with fresh idempotency key
194
+ return this.enqueue({
195
+ provider: original.provider,
196
+ eventType: original.eventType,
197
+ payload: original.payload,
198
+ targetUrl: original.targetUrl,
199
+ metadata: {
200
+ ...(original.metadata ? JSON.parse(original.metadata) : {}),
201
+ replayed_from: original.id,
202
+ replayed_at: Date.now(),
203
+ },
204
+ });
205
+ }
206
+ /** Get delivery statistics */
207
+ getStats() {
208
+ const db = getDb();
209
+ const counts = db.prepare(`
210
+ SELECT
211
+ COUNT(*) as total,
212
+ SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
213
+ SUM(CASE WHEN status = 'delivering' THEN 1 ELSE 0 END) as delivering,
214
+ SUM(CASE WHEN status = 'delivered' THEN 1 ELSE 0 END) as delivered,
215
+ SUM(CASE WHEN status = 'retrying' THEN 1 ELSE 0 END) as retrying,
216
+ SUM(CASE WHEN status = 'dead_letter' THEN 1 ELSE 0 END) as dead_letter,
217
+ MIN(CASE WHEN status IN ('pending', 'retrying') THEN created_at ELSE NULL END) as oldest_pending
218
+ FROM webhook_events
219
+ `).get();
220
+ return {
221
+ total: counts.total ?? 0,
222
+ pending: counts.pending ?? 0,
223
+ delivering: counts.delivering ?? 0,
224
+ delivered: counts.delivered ?? 0,
225
+ retrying: counts.retrying ?? 0,
226
+ deadLetter: counts.dead_letter ?? 0,
227
+ oldestPending: counts.oldest_pending ?? null,
228
+ };
229
+ }
230
+ /** Get delivery config */
231
+ getConfig() {
232
+ return { ...this.config };
233
+ }
234
+ /** Update delivery config */
235
+ updateConfig(patch) {
236
+ this.config = { ...this.config, ...patch };
237
+ return this.getConfig();
238
+ }
239
+ // ── Private: Delivery ──
240
+ async deliverAsync(event) {
241
+ if (this.activeDeliveries >= this.config.maxConcurrent) {
242
+ return; // Will be picked up by retry loop
243
+ }
244
+ this.activeDeliveries++;
245
+ try {
246
+ await this.deliver(event);
247
+ }
248
+ finally {
249
+ this.activeDeliveries--;
250
+ }
251
+ }
252
+ async deliver(event) {
253
+ const db = getDb();
254
+ const now = Date.now();
255
+ // Mark as delivering
256
+ db.prepare('UPDATE webhook_events SET status = ?, last_attempt_at = ?, attempts = attempts + 1 WHERE id = ?').run('delivering', now, event.id);
257
+ const result = await this.attemptDelivery(event);
258
+ if (result.success) {
259
+ // Delivered successfully
260
+ db.prepare(`
261
+ UPDATE webhook_events
262
+ SET status = 'delivered', delivered_at = ?, last_status_code = ?, last_error = NULL
263
+ WHERE id = ?
264
+ `).run(Date.now(), result.statusCode, event.id);
265
+ return;
266
+ }
267
+ // Delivery failed
268
+ const updatedAttempts = event.attempts + 1;
269
+ if (updatedAttempts >= event.maxAttempts) {
270
+ // Move to dead letter queue
271
+ db.prepare(`
272
+ UPDATE webhook_events
273
+ SET status = 'dead_letter', last_error = ?, last_status_code = ?, next_retry_at = NULL
274
+ WHERE id = ?
275
+ `).run(result.error, result.statusCode, event.id);
276
+ console.log(`[Webhooks] Dead letter: ${event.id} (${event.provider}/${event.eventType}) after ${updatedAttempts} attempts`);
277
+ return;
278
+ }
279
+ // Schedule retry with exponential backoff
280
+ const backoffMs = this.calculateBackoff(updatedAttempts);
281
+ const nextRetry = Date.now() + backoffMs;
282
+ db.prepare(`
283
+ UPDATE webhook_events
284
+ SET status = 'retrying', last_error = ?, last_status_code = ?, next_retry_at = ?
285
+ WHERE id = ?
286
+ `).run(result.error, result.statusCode, nextRetry, event.id);
287
+ }
288
+ async attemptDelivery(event) {
289
+ const start = Date.now();
290
+ try {
291
+ const controller = new AbortController();
292
+ const timeout = setTimeout(() => controller.abort(), this.config.deliveryTimeoutMs);
293
+ const response = await fetch(event.targetUrl, {
294
+ method: 'POST',
295
+ headers: {
296
+ 'Content-Type': 'application/json',
297
+ 'X-Webhook-ID': event.id,
298
+ 'X-Idempotency-Key': event.idempotencyKey,
299
+ 'X-Webhook-Event': event.eventType,
300
+ 'X-Webhook-Provider': event.provider,
301
+ 'X-Webhook-Attempt': String(event.attempts + 1),
302
+ 'X-Webhook-Timestamp': String(Date.now()),
303
+ },
304
+ body: event.payload,
305
+ signal: controller.signal,
306
+ });
307
+ clearTimeout(timeout);
308
+ const duration = Date.now() - start;
309
+ const success = response.status >= 200 && response.status < 300;
310
+ return {
311
+ success,
312
+ statusCode: response.status,
313
+ error: success ? null : `HTTP ${response.status} ${response.statusText}`,
314
+ duration,
315
+ };
316
+ }
317
+ catch (err) {
318
+ return {
319
+ success: false,
320
+ statusCode: null,
321
+ error: err?.name === 'AbortError'
322
+ ? `Timeout after ${this.config.deliveryTimeoutMs}ms`
323
+ : (err?.message || 'Network error'),
324
+ duration: Date.now() - start,
325
+ };
326
+ }
327
+ }
328
+ calculateBackoff(attempt) {
329
+ const backoff = this.config.initialBackoffMs * Math.pow(this.config.backoffMultiplier, attempt - 1);
330
+ // Add jitter: ±20%
331
+ const jitter = backoff * 0.2 * (Math.random() * 2 - 1);
332
+ return Math.min(backoff + jitter, this.config.maxBackoffMs);
333
+ }
334
+ // ── Private: Retry Loop ──
335
+ async processRetries() {
336
+ const db = getDb();
337
+ const now = Date.now();
338
+ const retryable = db.prepare(`
339
+ SELECT * FROM webhook_events
340
+ WHERE status = 'retrying'
341
+ AND next_retry_at IS NOT NULL
342
+ AND next_retry_at <= ?
343
+ ORDER BY next_retry_at ASC
344
+ LIMIT ?
345
+ `).all(now, this.config.maxConcurrent - this.activeDeliveries);
346
+ // Also pick up pending events that weren't delivered immediately
347
+ const pending = db.prepare(`
348
+ SELECT * FROM webhook_events
349
+ WHERE status = 'pending'
350
+ ORDER BY created_at ASC
351
+ LIMIT ?
352
+ `).all(Math.max(0, this.config.maxConcurrent - this.activeDeliveries - retryable.length));
353
+ const toProcess = [...retryable, ...pending];
354
+ if (toProcess.length === 0)
355
+ return;
356
+ await Promise.allSettled(toProcess.map(row => this.deliverAsync(this.rowToEvent(row))));
357
+ }
358
+ // ── Private: Cleanup ──
359
+ purgeExpired() {
360
+ const db = getDb();
361
+ const now = Date.now();
362
+ const result = db.prepare('DELETE FROM webhook_events WHERE expires_at < ? AND status = ?').run(now, 'delivered');
363
+ if ((result.changes ?? 0) > 0) {
364
+ console.log(`[Webhooks] Purged ${result.changes} expired delivered events`);
365
+ }
366
+ }
367
+ // ── Private: Row Mapping ──
368
+ rowToEvent(row) {
369
+ return {
370
+ id: row.id,
371
+ idempotencyKey: row.idempotency_key,
372
+ provider: row.provider,
373
+ eventType: row.event_type,
374
+ payload: row.payload,
375
+ targetUrl: row.target_url,
376
+ status: row.status,
377
+ attempts: row.attempts,
378
+ maxAttempts: row.max_attempts,
379
+ nextRetryAt: row.next_retry_at,
380
+ lastAttemptAt: row.last_attempt_at,
381
+ lastError: row.last_error,
382
+ lastStatusCode: row.last_status_code,
383
+ deliveredAt: row.delivered_at,
384
+ createdAt: row.created_at,
385
+ expiresAt: row.expires_at,
386
+ metadata: row.metadata ?? undefined,
387
+ };
388
+ }
389
+ }
390
+ // ── Singleton ──
391
+ let _manager = null;
392
+ export function getWebhookDeliveryManager(config) {
393
+ if (!_manager) {
394
+ _manager = new WebhookDeliveryManager(config);
395
+ }
396
+ return _manager;
397
+ }
398
+ //# sourceMappingURL=webhooks.js.map