lastlight 0.16.0 → 0.16.1

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 (385) hide show
  1. package/README.md +71 -692
  2. package/dist/cli-config.js.map +1 -0
  3. package/dist/cli-format.js.map +1 -0
  4. package/dist/{cli/cli-server.d.ts → cli-server.d.ts} +26 -1
  5. package/dist/{cli/cli-server.js → cli-server.js} +40 -5
  6. package/dist/cli-server.js.map +1 -0
  7. package/dist/cli-timeline.js.map +1 -0
  8. package/dist/{cli/cli.js → cli.js} +4 -3
  9. package/dist/cli.js.map +1 -0
  10. package/dist/{cli/fork-cli.d.ts → fork-cli.d.ts} +3 -3
  11. package/dist/{cli/fork-cli.js → fork-cli.js} +28 -27
  12. package/dist/fork-cli.js.map +1 -0
  13. package/dist/{cli/oauth-cli.js → oauth-cli.js} +1 -1
  14. package/dist/oauth-cli.js.map +1 -0
  15. package/dist/{cli/setup.js → setup.js} +10 -4
  16. package/dist/setup.js.map +1 -0
  17. package/dist/{cli/skills-install.d.ts → skills-install.d.ts} +6 -0
  18. package/dist/{cli/skills-install.js → skills-install.js} +6 -2
  19. package/dist/skills-install.js.map +1 -0
  20. package/package.json +20 -65
  21. package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
  22. package/agent-context/rules.md +0 -80
  23. package/agent-context/security.md +0 -69
  24. package/agent-context/soul.md +0 -21
  25. package/config/default.yaml +0 -119
  26. package/deploy/.env.production.example +0 -100
  27. package/deploy/entrypoint.sh +0 -82
  28. package/deploy/native/README.md +0 -160
  29. package/deploy/native/install.sh +0 -110
  30. package/deploy/native/lastlight.env.example +0 -95
  31. package/deploy/native/lastlight.service +0 -50
  32. package/deploy/sandbox-entrypoint.sh +0 -93
  33. package/dist/admin/auth.d.ts +0 -51
  34. package/dist/admin/auth.js +0 -121
  35. package/dist/admin/auth.js.map +0 -1
  36. package/dist/admin/chat-session-reader.d.ts +0 -39
  37. package/dist/admin/chat-session-reader.js +0 -84
  38. package/dist/admin/chat-session-reader.js.map +0 -1
  39. package/dist/admin/docker.d.ts +0 -61
  40. package/dist/admin/docker.js +0 -187
  41. package/dist/admin/docker.js.map +0 -1
  42. package/dist/admin/index.d.ts +0 -9
  43. package/dist/admin/index.js +0 -59
  44. package/dist/admin/index.js.map +0 -1
  45. package/dist/admin/routes.d.ts +0 -81
  46. package/dist/admin/routes.js +0 -1381
  47. package/dist/admin/routes.js.map +0 -1
  48. package/dist/admin/sessions.d.ts +0 -89
  49. package/dist/admin/sessions.js +0 -204
  50. package/dist/admin/sessions.js.map +0 -1
  51. package/dist/admin/tail.d.ts +0 -12
  52. package/dist/admin/tail.js +0 -145
  53. package/dist/admin/tail.js.map +0 -1
  54. package/dist/admin/version.d.ts +0 -22
  55. package/dist/admin/version.js +0 -92
  56. package/dist/admin/version.js.map +0 -1
  57. package/dist/cli/cli-config.js.map +0 -1
  58. package/dist/cli/cli-format.js.map +0 -1
  59. package/dist/cli/cli-server.js.map +0 -1
  60. package/dist/cli/cli-timeline.js.map +0 -1
  61. package/dist/cli/cli.js.map +0 -1
  62. package/dist/cli/fork-cli.js.map +0 -1
  63. package/dist/cli/oauth-cli.js.map +0 -1
  64. package/dist/cli/setup.js.map +0 -1
  65. package/dist/cli/skills-install.js.map +0 -1
  66. package/dist/config/config-resolve.d.ts +0 -28
  67. package/dist/config/config-resolve.js +0 -47
  68. package/dist/config/config-resolve.js.map +0 -1
  69. package/dist/config/config.d.ts +0 -157
  70. package/dist/config/config.js +0 -581
  71. package/dist/config/config.js.map +0 -1
  72. package/dist/config/core-pin.d.ts +0 -16
  73. package/dist/config/core-pin.js +0 -85
  74. package/dist/config/core-pin.js.map +0 -1
  75. package/dist/config/overlay-assets.d.ts +0 -20
  76. package/dist/config/overlay-assets.js +0 -114
  77. package/dist/config/overlay-assets.js.map +0 -1
  78. package/dist/config/overlay-bootstrap.d.ts +0 -44
  79. package/dist/config/overlay-bootstrap.js +0 -304
  80. package/dist/config/overlay-bootstrap.js.map +0 -1
  81. package/dist/connectors/github-webhook.d.ts +0 -45
  82. package/dist/connectors/github-webhook.js +0 -321
  83. package/dist/connectors/github-webhook.js.map +0 -1
  84. package/dist/connectors/index.d.ts +0 -18
  85. package/dist/connectors/index.js +0 -41
  86. package/dist/connectors/index.js.map +0 -1
  87. package/dist/connectors/messaging/base.d.ts +0 -42
  88. package/dist/connectors/messaging/base.js +0 -139
  89. package/dist/connectors/messaging/base.js.map +0 -1
  90. package/dist/connectors/messaging/delivery.d.ts +0 -14
  91. package/dist/connectors/messaging/delivery.js +0 -38
  92. package/dist/connectors/messaging/delivery.js.map +0 -1
  93. package/dist/connectors/messaging/index.d.ts +0 -4
  94. package/dist/connectors/messaging/index.js +0 -4
  95. package/dist/connectors/messaging/index.js.map +0 -1
  96. package/dist/connectors/messaging/session-manager.d.ts +0 -53
  97. package/dist/connectors/messaging/session-manager.js +0 -255
  98. package/dist/connectors/messaging/session-manager.js.map +0 -1
  99. package/dist/connectors/messaging/types.d.ts +0 -58
  100. package/dist/connectors/messaging/types.js +0 -7
  101. package/dist/connectors/messaging/types.js.map +0 -1
  102. package/dist/connectors/slack/connector.d.ts +0 -142
  103. package/dist/connectors/slack/connector.js +0 -494
  104. package/dist/connectors/slack/connector.js.map +0 -1
  105. package/dist/connectors/slack/index.d.ts +0 -2
  106. package/dist/connectors/slack/index.js +0 -3
  107. package/dist/connectors/slack/index.js.map +0 -1
  108. package/dist/connectors/slack/mrkdwn.d.ts +0 -19
  109. package/dist/connectors/slack/mrkdwn.js +0 -240
  110. package/dist/connectors/slack/mrkdwn.js.map +0 -1
  111. package/dist/connectors/types.d.ts +0 -61
  112. package/dist/connectors/types.js +0 -2
  113. package/dist/connectors/types.js.map +0 -1
  114. package/dist/cron/fanout.d.ts +0 -33
  115. package/dist/cron/fanout.js +0 -55
  116. package/dist/cron/fanout.js.map +0 -1
  117. package/dist/cron/jobs.d.ts +0 -18
  118. package/dist/cron/jobs.js +0 -37
  119. package/dist/cron/jobs.js.map +0 -1
  120. package/dist/cron/scheduler.d.ts +0 -45
  121. package/dist/cron/scheduler.js +0 -105
  122. package/dist/cron/scheduler.js.map +0 -1
  123. package/dist/engine/agent-executor.d.ts +0 -34
  124. package/dist/engine/agent-executor.js +0 -246
  125. package/dist/engine/agent-executor.js.map +0 -1
  126. package/dist/engine/chat/chat-runner.d.ts +0 -132
  127. package/dist/engine/chat/chat-runner.js +0 -424
  128. package/dist/engine/chat/chat-runner.js.map +0 -1
  129. package/dist/engine/chat/chat-skills.d.ts +0 -45
  130. package/dist/engine/chat/chat-skills.js +0 -184
  131. package/dist/engine/chat/chat-skills.js.map +0 -1
  132. package/dist/engine/chat/chat.d.ts +0 -54
  133. package/dist/engine/chat/chat.js +0 -316
  134. package/dist/engine/chat/chat.js.map +0 -1
  135. package/dist/engine/chat/message-batcher.d.ts +0 -32
  136. package/dist/engine/chat/message-batcher.js +0 -109
  137. package/dist/engine/chat/message-batcher.js.map +0 -1
  138. package/dist/engine/dispatcher.d.ts +0 -73
  139. package/dist/engine/dispatcher.js +0 -663
  140. package/dist/engine/dispatcher.js.map +0 -1
  141. package/dist/engine/event-shim.d.ts +0 -117
  142. package/dist/engine/event-shim.js +0 -435
  143. package/dist/engine/event-shim.js.map +0 -1
  144. package/dist/engine/executors/orchestrator.d.ts +0 -81
  145. package/dist/engine/executors/orchestrator.js +0 -365
  146. package/dist/engine/executors/orchestrator.js.map +0 -1
  147. package/dist/engine/executors/shared.d.ts +0 -189
  148. package/dist/engine/executors/shared.js +0 -616
  149. package/dist/engine/executors/shared.js.map +0 -1
  150. package/dist/engine/github/git-auth.d.ts +0 -62
  151. package/dist/engine/github/git-auth.js +0 -161
  152. package/dist/engine/github/git-auth.js.map +0 -1
  153. package/dist/engine/github/github-app-client.d.ts +0 -23
  154. package/dist/engine/github/github-app-client.js +0 -33
  155. package/dist/engine/github/github-app-client.js.map +0 -1
  156. package/dist/engine/github/github-tools.d.ts +0 -18
  157. package/dist/engine/github/github-tools.js +0 -263
  158. package/dist/engine/github/github-tools.js.map +0 -1
  159. package/dist/engine/github/github.d.ts +0 -1193
  160. package/dist/engine/github/github.js +0 -357
  161. package/dist/engine/github/github.js.map +0 -1
  162. package/dist/engine/github/profiles.d.ts +0 -279
  163. package/dist/engine/github/profiles.js +0 -42
  164. package/dist/engine/github/profiles.js.map +0 -1
  165. package/dist/engine/github/review-poster.d.ts +0 -98
  166. package/dist/engine/github/review-poster.js +0 -177
  167. package/dist/engine/github/review-poster.js.map +0 -1
  168. package/dist/engine/llm.d.ts +0 -79
  169. package/dist/engine/llm.js +0 -269
  170. package/dist/engine/llm.js.map +0 -1
  171. package/dist/engine/oauth.d.ts +0 -43
  172. package/dist/engine/oauth.js +0 -103
  173. package/dist/engine/oauth.js.map +0 -1
  174. package/dist/engine/router.d.ts +0 -29
  175. package/dist/engine/router.js +0 -680
  176. package/dist/engine/router.js.map +0 -1
  177. package/dist/engine/screen/classifier.d.ts +0 -93
  178. package/dist/engine/screen/classifier.js +0 -215
  179. package/dist/engine/screen/classifier.js.map +0 -1
  180. package/dist/engine/screen/screen.d.ts +0 -41
  181. package/dist/engine/screen/screen.js +0 -93
  182. package/dist/engine/screen/screen.js.map +0 -1
  183. package/dist/evals-api.d.ts +0 -24
  184. package/dist/evals-api.js +0 -22
  185. package/dist/evals-api.js.map +0 -1
  186. package/dist/index.d.ts +0 -1
  187. package/dist/index.js +0 -940
  188. package/dist/index.js.map +0 -1
  189. package/dist/managed-repos.d.ts +0 -30
  190. package/dist/managed-repos.js +0 -72
  191. package/dist/managed-repos.js.map +0 -1
  192. package/dist/notify/blocks.d.ts +0 -23
  193. package/dist/notify/blocks.js +0 -118
  194. package/dist/notify/blocks.js.map +0 -1
  195. package/dist/notify/index.d.ts +0 -17
  196. package/dist/notify/index.js +0 -7
  197. package/dist/notify/index.js.map +0 -1
  198. package/dist/notify/model.d.ts +0 -57
  199. package/dist/notify/model.js +0 -89
  200. package/dist/notify/model.js.map +0 -1
  201. package/dist/notify/notifier.d.ts +0 -18
  202. package/dist/notify/notifier.js +0 -100
  203. package/dist/notify/notifier.js.map +0 -1
  204. package/dist/notify/render.d.ts +0 -21
  205. package/dist/notify/render.js +0 -59
  206. package/dist/notify/render.js.map +0 -1
  207. package/dist/notify/transports/github.d.ts +0 -26
  208. package/dist/notify/transports/github.js +0 -27
  209. package/dist/notify/transports/github.js.map +0 -1
  210. package/dist/notify/transports/slack.d.ts +0 -27
  211. package/dist/notify/transports/slack.js +0 -37
  212. package/dist/notify/transports/slack.js.map +0 -1
  213. package/dist/notify/types.d.ts +0 -119
  214. package/dist/notify/types.js +0 -16
  215. package/dist/notify/types.js.map +0 -1
  216. package/dist/providers.d.ts +0 -125
  217. package/dist/providers.js +0 -279
  218. package/dist/providers.js.map +0 -1
  219. package/dist/sandbox/docker.d.ts +0 -180
  220. package/dist/sandbox/docker.js +0 -517
  221. package/dist/sandbox/docker.js.map +0 -1
  222. package/dist/sandbox/egress-allowlist.d.ts +0 -74
  223. package/dist/sandbox/egress-allowlist.js +0 -164
  224. package/dist/sandbox/egress-allowlist.js.map +0 -1
  225. package/dist/sandbox/egress-firewall-config.d.ts +0 -127
  226. package/dist/sandbox/egress-firewall-config.js +0 -434
  227. package/dist/sandbox/egress-firewall-config.js.map +0 -1
  228. package/dist/sandbox/images.d.ts +0 -23
  229. package/dist/sandbox/images.js +0 -55
  230. package/dist/sandbox/images.js.map +0 -1
  231. package/dist/sandbox/index.d.ts +0 -112
  232. package/dist/sandbox/index.js +0 -332
  233. package/dist/sandbox/index.js.map +0 -1
  234. package/dist/sandbox/sandbox.d.ts +0 -214
  235. package/dist/sandbox/sandbox.js +0 -453
  236. package/dist/sandbox/sandbox.js.map +0 -1
  237. package/dist/sandbox/smol.d.ts +0 -162
  238. package/dist/sandbox/smol.js +0 -485
  239. package/dist/sandbox/smol.js.map +0 -1
  240. package/dist/session-log.d.ts +0 -63
  241. package/dist/session-log.js +0 -290
  242. package/dist/session-log.js.map +0 -1
  243. package/dist/state/approval-store.d.ts +0 -88
  244. package/dist/state/approval-store.js +0 -149
  245. package/dist/state/approval-store.js.map +0 -1
  246. package/dist/state/build-assets.d.ts +0 -50
  247. package/dist/state/build-assets.js +0 -154
  248. package/dist/state/build-assets.js.map +0 -1
  249. package/dist/state/db.d.ts +0 -81
  250. package/dist/state/db.js +0 -155
  251. package/dist/state/db.js.map +0 -1
  252. package/dist/state/execution-store.d.ts +0 -257
  253. package/dist/state/execution-store.js +0 -527
  254. package/dist/state/execution-store.js.map +0 -1
  255. package/dist/state/migrate.d.ts +0 -15
  256. package/dist/state/migrate.js +0 -175
  257. package/dist/state/migrate.js.map +0 -1
  258. package/dist/state/workflow-run-store.d.ts +0 -216
  259. package/dist/state/workflow-run-store.js +0 -403
  260. package/dist/state/workflow-run-store.js.map +0 -1
  261. package/dist/telemetry/index.d.ts +0 -38
  262. package/dist/telemetry/index.js +0 -253
  263. package/dist/telemetry/index.js.map +0 -1
  264. package/dist/telemetry/pi-events.d.ts +0 -12
  265. package/dist/telemetry/pi-events.js +0 -134
  266. package/dist/telemetry/pi-events.js.map +0 -1
  267. package/dist/workflows/dag.d.ts +0 -37
  268. package/dist/workflows/dag.js +0 -118
  269. package/dist/workflows/dag.js.map +0 -1
  270. package/dist/workflows/loader.d.ts +0 -53
  271. package/dist/workflows/loader.js +0 -421
  272. package/dist/workflows/loader.js.map +0 -1
  273. package/dist/workflows/loop-eval.d.ts +0 -28
  274. package/dist/workflows/loop-eval.js +0 -74
  275. package/dist/workflows/loop-eval.js.map +0 -1
  276. package/dist/workflows/phase-executor.d.ts +0 -222
  277. package/dist/workflows/phase-executor.js +0 -1153
  278. package/dist/workflows/phase-executor.js.map +0 -1
  279. package/dist/workflows/phase-ref.d.ts +0 -50
  280. package/dist/workflows/phase-ref.js +0 -91
  281. package/dist/workflows/phase-ref.js.map +0 -1
  282. package/dist/workflows/resume.d.ts +0 -58
  283. package/dist/workflows/resume.js +0 -313
  284. package/dist/workflows/resume.js.map +0 -1
  285. package/dist/workflows/runner.d.ts +0 -63
  286. package/dist/workflows/runner.js +0 -381
  287. package/dist/workflows/runner.js.map +0 -1
  288. package/dist/workflows/schema.d.ts +0 -344
  289. package/dist/workflows/schema.js +0 -460
  290. package/dist/workflows/schema.js.map +0 -1
  291. package/dist/workflows/simple.d.ts +0 -90
  292. package/dist/workflows/simple.js +0 -393
  293. package/dist/workflows/simple.js.map +0 -1
  294. package/dist/workflows/target-policy.d.ts +0 -74
  295. package/dist/workflows/target-policy.js +0 -80
  296. package/dist/workflows/target-policy.js.map +0 -1
  297. package/dist/workflows/templates.d.ts +0 -88
  298. package/dist/workflows/templates.js +0 -127
  299. package/dist/workflows/templates.js.map +0 -1
  300. package/dist/workflows/triggers.d.ts +0 -21
  301. package/dist/workflows/triggers.js +0 -45
  302. package/dist/workflows/triggers.js.map +0 -1
  303. package/dist/workflows/verdict.d.ts +0 -19
  304. package/dist/workflows/verdict.js +0 -30
  305. package/dist/workflows/verdict.js.map +0 -1
  306. package/dist/worktree/manager.d.ts +0 -43
  307. package/dist/worktree/manager.js +0 -127
  308. package/dist/worktree/manager.js.map +0 -1
  309. package/docker-compose.yml +0 -274
  310. package/sandbox.Dockerfile +0 -68
  311. package/skills/README.md +0 -42
  312. package/skills/browser-qa/SKILL.md +0 -208
  313. package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
  314. package/skills/building/SKILL.md +0 -95
  315. package/skills/chat/SKILL.md +0 -36
  316. package/skills/code-review/SKILL.md +0 -82
  317. package/skills/debug-production/SKILL.md +0 -108
  318. package/skills/demo/SKILL.md +0 -228
  319. package/skills/demo/scripts/compose-demo.sh +0 -243
  320. package/skills/issue-answer/SKILL.md +0 -91
  321. package/skills/issue-comment/SKILL.md +0 -49
  322. package/skills/issue-triage/SKILL.md +0 -149
  323. package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
  324. package/skills/pr-comment/SKILL.md +0 -64
  325. package/skills/pr-review/SKILL.md +0 -148
  326. package/skills/pr-review/references/findings-schema.md +0 -89
  327. package/skills/qa-test/SKILL.md +0 -97
  328. package/skills/repo-health/SKILL.md +0 -67
  329. package/skills/security-feedback/SKILL.md +0 -173
  330. package/skills/security-feedback/references/templates.md +0 -77
  331. package/skills/security-review/SKILL.md +0 -215
  332. package/skills/security-review/references/issue-format.md +0 -302
  333. package/skills/verify/SKILL.md +0 -118
  334. package/workflows/answer.yaml +0 -44
  335. package/workflows/build.yaml +0 -129
  336. package/workflows/cron-health.yaml +0 -6
  337. package/workflows/cron-review.yaml +0 -8
  338. package/workflows/cron-security.yaml +0 -6
  339. package/workflows/cron-triage.yaml +0 -8
  340. package/workflows/demo.yaml +0 -62
  341. package/workflows/examples/bash-smoke.yaml +0 -41
  342. package/workflows/examples/parallel-review.yaml +0 -36
  343. package/workflows/examples/tdd-loop.yaml +0 -17
  344. package/workflows/explore.yaml +0 -80
  345. package/workflows/issue-comment.yaml +0 -15
  346. package/workflows/issue-triage.yaml +0 -22
  347. package/workflows/pr-comment.yaml +0 -16
  348. package/workflows/pr-fix.yaml +0 -17
  349. package/workflows/pr-review.yaml +0 -50
  350. package/workflows/prompts/answer.md +0 -68
  351. package/workflows/prompts/architect.md +0 -44
  352. package/workflows/prompts/classifier.md +0 -60
  353. package/workflows/prompts/classify-adds-info.md +0 -17
  354. package/workflows/prompts/demo.md +0 -125
  355. package/workflows/prompts/executor.md +0 -42
  356. package/workflows/prompts/explore-ask.md +0 -99
  357. package/workflows/prompts/explore-publish.md +0 -31
  358. package/workflows/prompts/explore-read.md +0 -120
  359. package/workflows/prompts/explore-synthesize.md +0 -88
  360. package/workflows/prompts/fix.md +0 -18
  361. package/workflows/prompts/guardrails.md +0 -96
  362. package/workflows/prompts/pr-fix.md +0 -26
  363. package/workflows/prompts/pr.md +0 -39
  364. package/workflows/prompts/qa-browser.md +0 -95
  365. package/workflows/prompts/qa-synth.md +0 -44
  366. package/workflows/prompts/qa-test.md +0 -60
  367. package/workflows/prompts/re-reviewer.md +0 -33
  368. package/workflows/prompts/reviewer.md +0 -60
  369. package/workflows/prompts/verify-browser.md +0 -93
  370. package/workflows/prompts/verify-synth.md +0 -44
  371. package/workflows/prompts/verify.md +0 -63
  372. package/workflows/qa-test.yaml +0 -94
  373. package/workflows/repo-health.yaml +0 -15
  374. package/workflows/security-feedback.yaml +0 -25
  375. package/workflows/security-review.yaml +0 -37
  376. package/workflows/verify.yaml +0 -93
  377. /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
  378. /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
  379. /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
  380. /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
  381. /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
  382. /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
  383. /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
  384. /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
  385. /package/dist/{cli/setup.d.ts → setup.d.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/connectors/messaging/delivery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,sBAAsB;IACzB,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEpD,gDAAgD;IAChD,QAAQ,CAAC,QAAgB,EAAE,MAAsB;QAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,QAAiB;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YACD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -1,4 +0,0 @@
1
- export { MessagingConnector } from "./base.js";
2
- export { SessionManager } from "./session-manager.js";
3
- export { MessageDeliveryService, type DeliveryTarget } from "./delivery.js";
4
- export type { MessagingConfig, ConversationKey, ConversationSession, ConversationMessage, IncomingMessageParams, } from "./types.js";
@@ -1,4 +0,0 @@
1
- export { MessagingConnector } from "./base.js";
2
- export { SessionManager } from "./session-manager.js";
3
- export { MessageDeliveryService } from "./delivery.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,eAAe,CAAC"}
@@ -1,53 +0,0 @@
1
- import type Database from "better-sqlite3";
2
- import type { ConversationKey, ConversationSession, ConversationMessage } from "./types.js";
3
- /**
4
- * SQLite-backed session manager for messaging conversations.
5
- * Shared across all messaging platform connectors.
6
- */
7
- export declare class SessionManager {
8
- private db;
9
- constructor(db: Database.Database);
10
- private migrate;
11
- /**
12
- * One-shot migration: copy `messaging_sessions` rows into a table
13
- * without the table-level UNIQUE constraint. `messaging_messages.session_id`
14
- * has a foreign key to this table, so `DROP TABLE messaging_sessions`
15
- * trips FK enforcement.
16
- *
17
- * Follows SQLite's official table-rebuild recipe
18
- * (https://www.sqlite.org/lang_altertable.html#otheralter): toggle
19
- * `foreign_keys` OFF *outside* a transaction, do the rebuild, run
20
- * `foreign_key_check` to confirm no orphans, COMMIT, re-enable.
21
- * `defer_foreign_keys` isn't enough — it pushes the check to COMMIT but
22
- * still fails when the schema flux at rename-time is observed.
23
- *
24
- * `foreign_key_check` after the rebuild is belt-and-suspenders: if the
25
- * copy somehow missed rows the messages reference, fail the migration
26
- * loudly rather than commit a half-broken schema.
27
- */
28
- private rebuildWithoutTableUnique;
29
- /** Look up an existing session by id (used to read its agent_session_id). */
30
- getSession(id: string): ConversationSession | null;
31
- /** Get an existing active session or create a new one */
32
- getOrCreateSession(key: ConversationKey): ConversationSession;
33
- /**
34
- * Persist the Agent SDK session id captured from the first chat reply in
35
- * a thread. Subsequent replies in the same thread pass this id back to
36
- * the SDK as `resume`, so the whole Slack thread maps to one continuous
37
- * Agent SDK session jsonl instead of a fresh file per message.
38
- */
39
- setAgentSessionId(id: string, agentSessionId: string | null): void;
40
- /** Update last activity timestamp and increment message count */
41
- touchSession(id: string): void;
42
- /** Deactivate a session (e.g., user sends /new or /reset) */
43
- deactivateSession(id: string): void;
44
- /** Store a message in the conversation history */
45
- addMessage(sessionId: string, role: "user" | "assistant", content: string, platformMessageId?: string): void;
46
- /** Get conversation history for a session (most recent N messages) */
47
- getHistory(sessionId: string, limit?: number): ConversationMessage[];
48
- /** Check if the bot is already participating in a thread (any user, any active non-stale session) */
49
- hasActiveThread(platform: string, channelId: string, threadId: string): boolean;
50
- /** Clean up old inactive sessions (call from cron) */
51
- cleanupStaleSessions(maxAgeDays?: number): number;
52
- private rowToSession;
53
- }
@@ -1,255 +0,0 @@
1
- import { randomUUID } from "crypto";
2
- /** Inactivity timeout before a session is considered stale (30 minutes) */
3
- const SESSION_TIMEOUT_MS = 30 * 60 * 1000;
4
- /**
5
- * SQLite-backed session manager for messaging conversations.
6
- * Shared across all messaging platform connectors.
7
- */
8
- export class SessionManager {
9
- db;
10
- constructor(db) {
11
- this.db = db;
12
- this.migrate();
13
- }
14
- migrate() {
15
- this.db.exec(`
16
- CREATE TABLE IF NOT EXISTS messaging_sessions (
17
- id TEXT PRIMARY KEY,
18
- platform TEXT NOT NULL,
19
- channel_id TEXT NOT NULL,
20
- thread_id TEXT,
21
- user_id TEXT NOT NULL,
22
- agent_session_id TEXT,
23
- created_at TEXT NOT NULL,
24
- last_activity_at TEXT NOT NULL,
25
- message_count INTEGER DEFAULT 0,
26
- active INTEGER DEFAULT 1
27
- );
28
-
29
- CREATE TABLE IF NOT EXISTS messaging_messages (
30
- id INTEGER PRIMARY KEY AUTOINCREMENT,
31
- session_id TEXT NOT NULL REFERENCES messaging_sessions(id),
32
- role TEXT NOT NULL,
33
- content TEXT NOT NULL,
34
- timestamp TEXT NOT NULL,
35
- platform_message_id TEXT
36
- );
37
-
38
- CREATE INDEX IF NOT EXISTS idx_msg_sessions_lookup
39
- ON messaging_sessions(platform, channel_id, thread_id, user_id);
40
- CREATE INDEX IF NOT EXISTS idx_msg_messages_session
41
- ON messaging_messages(session_id, timestamp);
42
- `);
43
- // Older versions of this code put an unconditional
44
- // `UNIQUE(platform, channel_id, thread_id, user_id)` on the table.
45
- // That collides with the get-or-create flow: a stale (active=0) row
46
- // for a returning user/thread would block the INSERT of a fresh
47
- // session. Replace it with a partial unique index that only enforces
48
- // the "one active session per key" invariant — the actually-desired
49
- // semantic. Inactive rows from past sessions are allowed to pile up
50
- // (deleted later by clearStale).
51
- const tableSql = this.db
52
- .prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='messaging_sessions'`)
53
- .get()?.sql ?? "";
54
- if (tableSql.includes("UNIQUE(platform")) {
55
- this.rebuildWithoutTableUnique();
56
- }
57
- this.db.exec(`
58
- CREATE UNIQUE INDEX IF NOT EXISTS idx_msg_sessions_unique_active
59
- ON messaging_sessions(platform, channel_id, thread_id, user_id)
60
- WHERE active = 1
61
- `);
62
- }
63
- /**
64
- * One-shot migration: copy `messaging_sessions` rows into a table
65
- * without the table-level UNIQUE constraint. `messaging_messages.session_id`
66
- * has a foreign key to this table, so `DROP TABLE messaging_sessions`
67
- * trips FK enforcement.
68
- *
69
- * Follows SQLite's official table-rebuild recipe
70
- * (https://www.sqlite.org/lang_altertable.html#otheralter): toggle
71
- * `foreign_keys` OFF *outside* a transaction, do the rebuild, run
72
- * `foreign_key_check` to confirm no orphans, COMMIT, re-enable.
73
- * `defer_foreign_keys` isn't enough — it pushes the check to COMMIT but
74
- * still fails when the schema flux at rename-time is observed.
75
- *
76
- * `foreign_key_check` after the rebuild is belt-and-suspenders: if the
77
- * copy somehow missed rows the messages reference, fail the migration
78
- * loudly rather than commit a half-broken schema.
79
- */
80
- rebuildWithoutTableUnique() {
81
- console.log("[messaging] migrating messaging_sessions: dropping unconditional UNIQUE constraint");
82
- const fkOriginal = this.db.pragma("foreign_keys", { simple: true });
83
- this.db.pragma("foreign_keys = OFF");
84
- try {
85
- this.db.exec("BEGIN");
86
- try {
87
- this.db.exec(`
88
- CREATE TABLE messaging_sessions__new (
89
- id TEXT PRIMARY KEY,
90
- platform TEXT NOT NULL,
91
- channel_id TEXT NOT NULL,
92
- thread_id TEXT,
93
- user_id TEXT NOT NULL,
94
- agent_session_id TEXT,
95
- created_at TEXT NOT NULL,
96
- last_activity_at TEXT NOT NULL,
97
- message_count INTEGER DEFAULT 0,
98
- active INTEGER DEFAULT 1
99
- );
100
- INSERT INTO messaging_sessions__new
101
- SELECT id, platform, channel_id, thread_id, user_id, agent_session_id,
102
- created_at, last_activity_at, message_count, active
103
- FROM messaging_sessions;
104
- DROP TABLE messaging_sessions;
105
- ALTER TABLE messaging_sessions__new RENAME TO messaging_sessions;
106
- CREATE INDEX IF NOT EXISTS idx_msg_sessions_lookup
107
- ON messaging_sessions(platform, channel_id, thread_id, user_id);
108
- `);
109
- const violations = this.db.pragma("foreign_key_check");
110
- if (violations.length > 0) {
111
- throw new Error(`FK check failed after migration — ${violations.length} dangling reference(s): ` +
112
- JSON.stringify(violations));
113
- }
114
- this.db.exec("COMMIT");
115
- }
116
- catch (err) {
117
- this.db.exec("ROLLBACK");
118
- throw err;
119
- }
120
- }
121
- finally {
122
- if (fkOriginal)
123
- this.db.pragma("foreign_keys = ON");
124
- }
125
- }
126
- /** Look up an existing session by id (used to read its agent_session_id). */
127
- getSession(id) {
128
- const row = this.db.prepare(`SELECT * FROM messaging_sessions WHERE id = ?`).get(id);
129
- return row ? this.rowToSession(row) : null;
130
- }
131
- /** Get an existing active session or create a new one */
132
- getOrCreateSession(key) {
133
- const now = new Date().toISOString();
134
- const cutoff = new Date(Date.now() - SESSION_TIMEOUT_MS).toISOString();
135
- // Look for an active, non-stale session
136
- const existing = this.db.prepare(`
137
- SELECT * FROM messaging_sessions
138
- WHERE platform = ? AND channel_id = ? AND thread_id IS ? AND user_id = ?
139
- AND active = 1 AND last_activity_at >= ?
140
- `).get(key.platform, key.channelId, key.threadId, key.userId, cutoff);
141
- if (existing) {
142
- return this.rowToSession(existing);
143
- }
144
- // Deactivate any stale sessions for this key
145
- this.db.prepare(`
146
- UPDATE messaging_sessions SET active = 0
147
- WHERE platform = ? AND channel_id = ? AND thread_id IS ? AND user_id = ? AND active = 1
148
- `).run(key.platform, key.channelId, key.threadId, key.userId);
149
- // Create new session
150
- const id = randomUUID();
151
- this.db.prepare(`
152
- INSERT INTO messaging_sessions (id, platform, channel_id, thread_id, user_id, created_at, last_activity_at)
153
- VALUES (?, ?, ?, ?, ?, ?, ?)
154
- `).run(id, key.platform, key.channelId, key.threadId, key.userId, now, now);
155
- return {
156
- id,
157
- platform: key.platform,
158
- channelId: key.channelId,
159
- threadId: key.threadId,
160
- userId: key.userId,
161
- agentSessionId: null,
162
- createdAt: now,
163
- lastActivityAt: now,
164
- messageCount: 0,
165
- active: true,
166
- };
167
- }
168
- /**
169
- * Persist the Agent SDK session id captured from the first chat reply in
170
- * a thread. Subsequent replies in the same thread pass this id back to
171
- * the SDK as `resume`, so the whole Slack thread maps to one continuous
172
- * Agent SDK session jsonl instead of a fresh file per message.
173
- */
174
- setAgentSessionId(id, agentSessionId) {
175
- this.db.prepare(`
176
- UPDATE messaging_sessions SET agent_session_id = ? WHERE id = ?
177
- `).run(agentSessionId, id);
178
- }
179
- /** Update last activity timestamp and increment message count */
180
- touchSession(id) {
181
- this.db.prepare(`
182
- UPDATE messaging_sessions
183
- SET last_activity_at = ?, message_count = message_count + 1
184
- WHERE id = ?
185
- `).run(new Date().toISOString(), id);
186
- }
187
- /** Deactivate a session (e.g., user sends /new or /reset) */
188
- deactivateSession(id) {
189
- this.db.prepare(`UPDATE messaging_sessions SET active = 0 WHERE id = ?`).run(id);
190
- }
191
- /** Store a message in the conversation history */
192
- addMessage(sessionId, role, content, platformMessageId) {
193
- this.db.prepare(`
194
- INSERT INTO messaging_messages (session_id, role, content, timestamp, platform_message_id)
195
- VALUES (?, ?, ?, ?, ?)
196
- `).run(sessionId, role, content, new Date().toISOString(), platformMessageId || null);
197
- }
198
- /** Get conversation history for a session (most recent N messages) */
199
- getHistory(sessionId, limit = 50) {
200
- const rows = this.db.prepare(`
201
- SELECT * FROM messaging_messages
202
- WHERE session_id = ?
203
- ORDER BY timestamp ASC
204
- LIMIT ?
205
- `).all(sessionId, limit);
206
- return rows.map((r) => ({
207
- id: r.id,
208
- sessionId: r.session_id,
209
- role: r.role,
210
- content: r.content,
211
- timestamp: r.timestamp,
212
- platformMessageId: r.platform_message_id,
213
- }));
214
- }
215
- /** Check if the bot is already participating in a thread (any user, any active non-stale session) */
216
- hasActiveThread(platform, channelId, threadId) {
217
- const cutoff = new Date(Date.now() - SESSION_TIMEOUT_MS).toISOString();
218
- const row = this.db.prepare(`
219
- SELECT 1 FROM messaging_sessions
220
- WHERE platform = ? AND channel_id = ? AND thread_id = ?
221
- AND active = 1 AND last_activity_at >= ?
222
- LIMIT 1
223
- `).get(platform, channelId, threadId);
224
- return !!row;
225
- }
226
- /** Clean up old inactive sessions (call from cron) */
227
- cleanupStaleSessions(maxAgeDays = 7) {
228
- const cutoff = new Date(Date.now() - maxAgeDays * 24 * 60 * 60 * 1000).toISOString();
229
- // Delete messages for old sessions first
230
- this.db.prepare(`
231
- DELETE FROM messaging_messages WHERE session_id IN (
232
- SELECT id FROM messaging_sessions WHERE active = 0 AND last_activity_at < ?
233
- )
234
- `).run(cutoff);
235
- const result = this.db.prepare(`
236
- DELETE FROM messaging_sessions WHERE active = 0 AND last_activity_at < ?
237
- `).run(cutoff);
238
- return result.changes;
239
- }
240
- rowToSession(row) {
241
- return {
242
- id: row.id,
243
- platform: row.platform,
244
- channelId: row.channel_id,
245
- threadId: row.thread_id,
246
- userId: row.user_id,
247
- agentSessionId: row.agent_session_id,
248
- createdAt: row.created_at,
249
- lastActivityAt: row.last_activity_at,
250
- messageCount: row.message_count,
251
- active: !!row.active,
252
- };
253
- }
254
- }
255
- //# sourceMappingURL=session-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/connectors/messaging/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,EAAE,CAAoB;IAE9B,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2BZ,CAAC,CAAC;QAEH,mDAAmD;QACnD,mEAAmE;QACnE,oEAAoE;QACpE,gEAAgE;QAChE,qEAAqE;QACrE,oEAAoE;QACpE,oEAAoE;QACpE,iCAAiC;QACjC,MAAM,QAAQ,GAAI,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,gFAAgF,CAAC;aACzF,GAAG,EAAmC,EAAE,GAAG,IAAI,EAAE,CAAC;QACrD,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;KAIZ,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,yBAAyB;QAC/B,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAClG,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;SAqBZ,CAAC,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAc,CAAC;gBACpE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CACb,qCAAqC,UAAU,CAAC,MAAM,0BAA0B;wBAChF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAC3B,CAAC;gBACJ,CAAC;gBACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU;gBAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,UAAU,CAAC,EAAU;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwC,CAAC;QAC5H,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,yDAAyD;IACzD,kBAAkB,CAAC,GAAoB;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;QAEvE,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIhC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAQ,CAAC;QAE7E,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAE9D,qBAAqB;QACrB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAE5E,OAAO;YACL,EAAE;YACF,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,GAAG;YACd,cAAc,EAAE,GAAG;YACnB,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,EAAU,EAAE,cAA6B;QACzD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAEf,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,iEAAiE;IACjE,YAAY,CAAC,EAAU;QACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,6DAA6D;IAC7D,iBAAiB,CAAC,EAAU;QAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,kDAAkD;IAClD,UAAU,CAAC,SAAiB,EAAE,IAA0B,EAAE,OAAe,EAAE,iBAA0B;QACnG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,iBAAiB,IAAI,IAAI,CAAC,CAAC;IACxF,CAAC;IAED,sEAAsE;IACtE,UAAU,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAU,CAAC;QAElC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,iBAAiB,EAAE,CAAC,CAAC,mBAAmB;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,qGAAqG;IACrG,eAAe,CAAC,QAAgB,EAAE,SAAiB,EAAE,QAAgB;QACnE,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK3B,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC,GAAG,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,oBAAoB,CAAC,UAAU,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAErF,yCAAyC;QACzC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE9B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEf,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAEO,YAAY,CAAC,GAAQ;QAC3B,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,cAAc,EAAE,GAAG,CAAC,gBAAgB;YACpC,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,cAAc,EAAE,GAAG,CAAC,gBAAgB;YACpC,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;CACF"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Shared types for messaging platform connectors (Slack, Discord, Teams, etc.).
3
- * Platform-specific connectors extend MessagingConfig and implement
4
- * the abstract methods in MessagingConnector.
5
- */
6
- /** Base config shared by all messaging connectors */
7
- export interface MessagingConfig {
8
- /** Platform user IDs allowed to interact with the bot */
9
- allowedUsers: string[];
10
- /** Bot's identifier for @mention detection (platform-specific format) */
11
- botIdentifier: string;
12
- }
13
- /** Unique key identifying a conversation thread */
14
- export interface ConversationKey {
15
- /** Platform name (e.g., "slack", "discord") */
16
- platform: string;
17
- /** Platform-specific channel/DM identifier */
18
- channelId: string;
19
- /** Thread identifier (null for top-level DMs) */
20
- threadId: string | null;
21
- /** User who initiated */
22
- userId: string;
23
- }
24
- /** Persisted conversation session */
25
- export interface ConversationSession {
26
- id: string;
27
- platform: string;
28
- channelId: string;
29
- threadId: string | null;
30
- userId: string;
31
- /** Agent SDK session ID for multi-turn context (reserved for future use) */
32
- agentSessionId: string | null;
33
- createdAt: string;
34
- lastActivityAt: string;
35
- messageCount: number;
36
- active: boolean;
37
- }
38
- /** A single message in a conversation */
39
- export interface ConversationMessage {
40
- id: number;
41
- sessionId: string;
42
- role: "user" | "assistant";
43
- content: string;
44
- timestamp: string;
45
- platformMessageId: string | null;
46
- }
47
- /** Parameters passed from platform connector to handleIncomingMessage() */
48
- export interface IncomingMessageParams {
49
- platformUserId: string;
50
- platformUsername: string;
51
- channelId: string;
52
- threadId: string | null;
53
- messageId: string;
54
- text: string;
55
- isDM: boolean;
56
- isMention: boolean;
57
- raw: unknown;
58
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * Shared types for messaging platform connectors (Slack, Discord, Teams, etc.).
3
- * Platform-specific connectors extend MessagingConfig and implement
4
- * the abstract methods in MessagingConnector.
5
- */
6
- export {};
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/connectors/messaging/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,142 +0,0 @@
1
- import { type KnownBlock } from "@slack/web-api";
2
- import type { Hono } from "hono";
3
- import { MessagingConnector } from "../messaging/base.js";
4
- import type { SessionManager } from "../messaging/session-manager.js";
5
- import type { MessagingConfig } from "../messaging/types.js";
6
- import type { EventEnvelope } from "../types.js";
7
- /**
8
- * A resolved approval-button click, handed to the app for routing. `envelope`
9
- * carries a `reply()` that posts a confirmation into the button's thread, so
10
- * the same approval-resolution path used by `/approve` can run unchanged.
11
- */
12
- export interface SlackApprovalAction {
13
- decision: "approved" | "rejected";
14
- /** The paused workflow run id (the button's `value`). */
15
- workflowRunId: string;
16
- sender: string;
17
- envelope: EventEnvelope;
18
- }
19
- export interface SlackConnectorConfig extends MessagingConfig {
20
- /** Bot User OAuth Token (xoxb-…) — used for all Web API calls (sending). */
21
- botToken: string;
22
- /** How events are received. */
23
- mode: "webhook" | "socket";
24
- /** App-Level Token for Socket Mode (xapp-…). Required when mode === "socket". */
25
- appToken?: string;
26
- /** Events API signing secret. Required when mode === "webhook". */
27
- signingSecret?: string;
28
- /** Channel ID for cron report delivery */
29
- deliveryChannel?: string;
30
- /**
31
- * Shared Hono app to mount `POST /webhooks/slack` on (webhook mode). This is
32
- * the same HTTP server the GitHub webhook + /api/chat already run on. Must be
33
- * present in webhook mode.
34
- */
35
- honoApp?: Hono;
36
- }
37
- /**
38
- * Slack connector. Two receive modes:
39
- *
40
- * - **webhook** (default/prod): the HTTP Events API. Slack POSTs to
41
- * `/webhooks/slack`; we verify the signing-secret signature, answer the
42
- * one-time url_verification handshake, dedup retries by `event_id`, and ack
43
- * within Slack's 3s window while processing async. Slack retries failed
44
- * deliveries, so this is at-least-once — it does not silently drop messages
45
- * the way Socket Mode does.
46
- * - **socket** (dev fallback): Socket Mode over a WebSocket, no public URL
47
- * needed. At-most-once; kept only for local development.
48
- *
49
- * Sending is identical in both modes via a `WebClient`.
50
- *
51
- * Behaviors:
52
- * - DMs: responds to every message (subscribe `message.im` in webhook mode)
53
- * - Channels: only responds when @mentioned (subscribe `app_mention`)
54
- */
55
- export declare class SlackConnector extends MessagingConnector {
56
- readonly name = "slack";
57
- /** Web API client for sending — used in both modes. */
58
- private web;
59
- /** Bolt app — constructed only in socket mode, purely as the receiver. */
60
- private bolt;
61
- private slackConfig;
62
- private userCache;
63
- /** Bounded set of processed Events API delivery ids, to drop Slack retries. */
64
- private seenEventIds;
65
- private seenEventOrder;
66
- /** App-provided hook that routes an approval button click into the dispatcher. */
67
- private approvalHandler?;
68
- constructor(config: SlackConnectorConfig, sessionManager: SessionManager);
69
- /**
70
- * Register the hook that routes an approval button click into the app's
71
- * dispatcher. Wired in `src/index.ts` (after the dispatch deps exist) to the
72
- * same `approval-response` resolution path as the `/approve` slash command.
73
- */
74
- onApprovalAction(handler: (action: SlackApprovalAction) => Promise<void>): void;
75
- start(): Promise<void>;
76
- stop(): Promise<void>;
77
- /**
78
- * Post a message. When `blocks` are supplied they carry the rich rendering;
79
- * `text` is still sent as the notification preview + accessibility fallback
80
- * (Slack requires it and truncates it for the push/desktop notification).
81
- * When no explicit blocks are given but the text contains a markdown image,
82
- * the message is auto-promoted to Block Kit so the image renders inline (the
83
- * mrkdwn text path can only downgrade `![alt](url)` to a link); if Slack
84
- * rejects the generated blocks (e.g. an unreachable image URL) it falls back
85
- * to a plain-text post.
86
- */
87
- sendMessage(channelId: string, threadId: string | null, text: string, blocks?: KnownBlock[]): Promise<string | void>;
88
- /**
89
- * Edit a previously-sent message in place (`chat.update`). Paired with the
90
- * `ts` returned by `sendMessage`, this powers the single in-place status
91
- * checklist (see `src/notify/transports/slack.ts`) so a workflow's progress
92
- * updates one message instead of flooding the thread. Note: `chat.update` is
93
- * silent — it does not re-notify — so a separate terminal message is posted
94
- * at the end for an actual ping.
95
- */
96
- updateMessage(channelId: string, ts: string, text: string, blocks?: KnownBlock[]): Promise<void>;
97
- addReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
98
- showTyping(channelId: string, messageId: string, threadRootId: string): Promise<void>;
99
- /** Clear the thinking status after processing completes */
100
- clearTyping(channelId: string, threadId: string): Promise<void>;
101
- /** Send a message to the configured delivery channel (for cron reports) */
102
- sendToDeliveryChannel(text: string): Promise<void>;
103
- /**
104
- * Mount `POST /webhooks/slack` on the shared Hono app. Verifies the request
105
- * signature, handles the url_verification handshake, dedups retries, and
106
- * acks fast while processing the event asynchronously.
107
- */
108
- private mountWebhookRoute;
109
- /** Wire Bolt block-action listeners (socket mode) to the same handler. */
110
- private setupInteractionListeners;
111
- /**
112
- * Resolve an approval button click: rewrite the prompt message to a
113
- * button-free resolved state, then route the decision through the app's
114
- * approval handler (the same path as the `/approve` slash command).
115
- */
116
- private handleInteraction;
117
- /** Rewrite an approval prompt to a resolved, button-free state. */
118
- private resolveApprovalMessage;
119
- /** Route a raw Events API `event` object to the right handler. */
120
- private dispatchSlackEvent;
121
- /**
122
- * Record an Events API delivery id as seen. Returns true if it was already
123
- * seen (a Slack retry). Bounded to the most recent ~1000 ids.
124
- */
125
- private markSeen;
126
- private setupSocketListeners;
127
- /** A raw Slack `message` event (DM or channel). */
128
- private onMessageEvent;
129
- /** A raw Slack `app_mention` event (always a channel mention). */
130
- private onAppMention;
131
- /** Resolve a Slack user ID to a username (cached) */
132
- private resolveUsername;
133
- }
134
- /**
135
- * Verify a Slack Events API request signature.
136
- *
137
- * Slack signs `v0:{timestamp}:{rawBody}` with the app's signing secret and
138
- * sends it as `x-slack-signature: v0=…`. We recompute and compare in constant
139
- * time, and reject requests whose timestamp is more than 5 minutes off (replay
140
- * protection). `now` is injectable for tests. Exported for unit testing.
141
- */
142
- export declare function verifySlackSignature(body: string, timestamp: string, signature: string, signingSecret: string, now?: number): boolean;