lastlight 0.15.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 (382) 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 -100
  103. package/dist/connectors/slack/connector.js +0 -341
  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 -8
  109. package/dist/connectors/slack/mrkdwn.js +0 -123
  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 -923
  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/index.d.ts +0 -15
  193. package/dist/notify/index.js +0 -6
  194. package/dist/notify/index.js.map +0 -1
  195. package/dist/notify/model.d.ts +0 -57
  196. package/dist/notify/model.js +0 -89
  197. package/dist/notify/model.js.map +0 -1
  198. package/dist/notify/notifier.d.ts +0 -17
  199. package/dist/notify/notifier.js +0 -87
  200. package/dist/notify/notifier.js.map +0 -1
  201. package/dist/notify/render.d.ts +0 -21
  202. package/dist/notify/render.js +0 -59
  203. package/dist/notify/render.js.map +0 -1
  204. package/dist/notify/transports/github.d.ts +0 -26
  205. package/dist/notify/transports/github.js +0 -26
  206. package/dist/notify/transports/github.js.map +0 -1
  207. package/dist/notify/transports/slack.d.ts +0 -26
  208. package/dist/notify/transports/slack.js +0 -28
  209. package/dist/notify/transports/slack.js.map +0 -1
  210. package/dist/notify/types.d.ts +0 -95
  211. package/dist/notify/types.js +0 -16
  212. package/dist/notify/types.js.map +0 -1
  213. package/dist/providers.d.ts +0 -125
  214. package/dist/providers.js +0 -279
  215. package/dist/providers.js.map +0 -1
  216. package/dist/sandbox/docker.d.ts +0 -180
  217. package/dist/sandbox/docker.js +0 -517
  218. package/dist/sandbox/docker.js.map +0 -1
  219. package/dist/sandbox/egress-allowlist.d.ts +0 -74
  220. package/dist/sandbox/egress-allowlist.js +0 -164
  221. package/dist/sandbox/egress-allowlist.js.map +0 -1
  222. package/dist/sandbox/egress-firewall-config.d.ts +0 -127
  223. package/dist/sandbox/egress-firewall-config.js +0 -434
  224. package/dist/sandbox/egress-firewall-config.js.map +0 -1
  225. package/dist/sandbox/images.d.ts +0 -23
  226. package/dist/sandbox/images.js +0 -55
  227. package/dist/sandbox/images.js.map +0 -1
  228. package/dist/sandbox/index.d.ts +0 -112
  229. package/dist/sandbox/index.js +0 -332
  230. package/dist/sandbox/index.js.map +0 -1
  231. package/dist/sandbox/sandbox.d.ts +0 -214
  232. package/dist/sandbox/sandbox.js +0 -453
  233. package/dist/sandbox/sandbox.js.map +0 -1
  234. package/dist/sandbox/smol.d.ts +0 -162
  235. package/dist/sandbox/smol.js +0 -485
  236. package/dist/sandbox/smol.js.map +0 -1
  237. package/dist/session-log.d.ts +0 -63
  238. package/dist/session-log.js +0 -290
  239. package/dist/session-log.js.map +0 -1
  240. package/dist/state/approval-store.d.ts +0 -88
  241. package/dist/state/approval-store.js +0 -149
  242. package/dist/state/approval-store.js.map +0 -1
  243. package/dist/state/build-assets.d.ts +0 -50
  244. package/dist/state/build-assets.js +0 -154
  245. package/dist/state/build-assets.js.map +0 -1
  246. package/dist/state/db.d.ts +0 -81
  247. package/dist/state/db.js +0 -155
  248. package/dist/state/db.js.map +0 -1
  249. package/dist/state/execution-store.d.ts +0 -257
  250. package/dist/state/execution-store.js +0 -527
  251. package/dist/state/execution-store.js.map +0 -1
  252. package/dist/state/migrate.d.ts +0 -15
  253. package/dist/state/migrate.js +0 -175
  254. package/dist/state/migrate.js.map +0 -1
  255. package/dist/state/workflow-run-store.d.ts +0 -216
  256. package/dist/state/workflow-run-store.js +0 -403
  257. package/dist/state/workflow-run-store.js.map +0 -1
  258. package/dist/telemetry/index.d.ts +0 -38
  259. package/dist/telemetry/index.js +0 -253
  260. package/dist/telemetry/index.js.map +0 -1
  261. package/dist/telemetry/pi-events.d.ts +0 -12
  262. package/dist/telemetry/pi-events.js +0 -134
  263. package/dist/telemetry/pi-events.js.map +0 -1
  264. package/dist/workflows/dag.d.ts +0 -37
  265. package/dist/workflows/dag.js +0 -118
  266. package/dist/workflows/dag.js.map +0 -1
  267. package/dist/workflows/loader.d.ts +0 -53
  268. package/dist/workflows/loader.js +0 -421
  269. package/dist/workflows/loader.js.map +0 -1
  270. package/dist/workflows/loop-eval.d.ts +0 -28
  271. package/dist/workflows/loop-eval.js +0 -74
  272. package/dist/workflows/loop-eval.js.map +0 -1
  273. package/dist/workflows/phase-executor.d.ts +0 -215
  274. package/dist/workflows/phase-executor.js +0 -1144
  275. package/dist/workflows/phase-executor.js.map +0 -1
  276. package/dist/workflows/phase-ref.d.ts +0 -50
  277. package/dist/workflows/phase-ref.js +0 -91
  278. package/dist/workflows/phase-ref.js.map +0 -1
  279. package/dist/workflows/resume.d.ts +0 -58
  280. package/dist/workflows/resume.js +0 -313
  281. package/dist/workflows/resume.js.map +0 -1
  282. package/dist/workflows/runner.d.ts +0 -63
  283. package/dist/workflows/runner.js +0 -364
  284. package/dist/workflows/runner.js.map +0 -1
  285. package/dist/workflows/schema.d.ts +0 -344
  286. package/dist/workflows/schema.js +0 -460
  287. package/dist/workflows/schema.js.map +0 -1
  288. package/dist/workflows/simple.d.ts +0 -90
  289. package/dist/workflows/simple.js +0 -393
  290. package/dist/workflows/simple.js.map +0 -1
  291. package/dist/workflows/target-policy.d.ts +0 -74
  292. package/dist/workflows/target-policy.js +0 -80
  293. package/dist/workflows/target-policy.js.map +0 -1
  294. package/dist/workflows/templates.d.ts +0 -88
  295. package/dist/workflows/templates.js +0 -127
  296. package/dist/workflows/templates.js.map +0 -1
  297. package/dist/workflows/triggers.d.ts +0 -21
  298. package/dist/workflows/triggers.js +0 -45
  299. package/dist/workflows/triggers.js.map +0 -1
  300. package/dist/workflows/verdict.d.ts +0 -19
  301. package/dist/workflows/verdict.js +0 -30
  302. package/dist/workflows/verdict.js.map +0 -1
  303. package/dist/worktree/manager.d.ts +0 -43
  304. package/dist/worktree/manager.js +0 -127
  305. package/dist/worktree/manager.js.map +0 -1
  306. package/docker-compose.yml +0 -274
  307. package/sandbox.Dockerfile +0 -68
  308. package/skills/README.md +0 -42
  309. package/skills/browser-qa/SKILL.md +0 -208
  310. package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
  311. package/skills/building/SKILL.md +0 -95
  312. package/skills/chat/SKILL.md +0 -36
  313. package/skills/code-review/SKILL.md +0 -82
  314. package/skills/debug-production/SKILL.md +0 -108
  315. package/skills/demo/SKILL.md +0 -228
  316. package/skills/demo/scripts/compose-demo.sh +0 -243
  317. package/skills/issue-answer/SKILL.md +0 -91
  318. package/skills/issue-comment/SKILL.md +0 -49
  319. package/skills/issue-triage/SKILL.md +0 -149
  320. package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
  321. package/skills/pr-comment/SKILL.md +0 -64
  322. package/skills/pr-review/SKILL.md +0 -148
  323. package/skills/pr-review/references/findings-schema.md +0 -89
  324. package/skills/qa-test/SKILL.md +0 -97
  325. package/skills/repo-health/SKILL.md +0 -67
  326. package/skills/security-feedback/SKILL.md +0 -173
  327. package/skills/security-feedback/references/templates.md +0 -77
  328. package/skills/security-review/SKILL.md +0 -215
  329. package/skills/security-review/references/issue-format.md +0 -302
  330. package/skills/verify/SKILL.md +0 -118
  331. package/workflows/answer.yaml +0 -44
  332. package/workflows/build.yaml +0 -129
  333. package/workflows/cron-health.yaml +0 -6
  334. package/workflows/cron-review.yaml +0 -8
  335. package/workflows/cron-security.yaml +0 -6
  336. package/workflows/cron-triage.yaml +0 -8
  337. package/workflows/demo.yaml +0 -62
  338. package/workflows/examples/bash-smoke.yaml +0 -41
  339. package/workflows/examples/parallel-review.yaml +0 -36
  340. package/workflows/examples/tdd-loop.yaml +0 -17
  341. package/workflows/explore.yaml +0 -80
  342. package/workflows/issue-comment.yaml +0 -15
  343. package/workflows/issue-triage.yaml +0 -22
  344. package/workflows/pr-comment.yaml +0 -16
  345. package/workflows/pr-fix.yaml +0 -17
  346. package/workflows/pr-review.yaml +0 -50
  347. package/workflows/prompts/answer.md +0 -68
  348. package/workflows/prompts/architect.md +0 -44
  349. package/workflows/prompts/classifier.md +0 -60
  350. package/workflows/prompts/classify-adds-info.md +0 -17
  351. package/workflows/prompts/demo.md +0 -125
  352. package/workflows/prompts/executor.md +0 -42
  353. package/workflows/prompts/explore-ask.md +0 -99
  354. package/workflows/prompts/explore-publish.md +0 -31
  355. package/workflows/prompts/explore-read.md +0 -120
  356. package/workflows/prompts/explore-synthesize.md +0 -88
  357. package/workflows/prompts/fix.md +0 -18
  358. package/workflows/prompts/guardrails.md +0 -96
  359. package/workflows/prompts/pr-fix.md +0 -26
  360. package/workflows/prompts/pr.md +0 -39
  361. package/workflows/prompts/qa-browser.md +0 -95
  362. package/workflows/prompts/qa-synth.md +0 -44
  363. package/workflows/prompts/qa-test.md +0 -60
  364. package/workflows/prompts/re-reviewer.md +0 -33
  365. package/workflows/prompts/reviewer.md +0 -60
  366. package/workflows/prompts/verify-browser.md +0 -93
  367. package/workflows/prompts/verify-synth.md +0 -44
  368. package/workflows/prompts/verify.md +0 -63
  369. package/workflows/qa-test.yaml +0 -94
  370. package/workflows/repo-health.yaml +0 -15
  371. package/workflows/security-feedback.yaml +0 -25
  372. package/workflows/security-review.yaml +0 -37
  373. package/workflows/verify.yaml +0 -93
  374. /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
  375. /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
  376. /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
  377. /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
  378. /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
  379. /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
  380. /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
  381. /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
  382. /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":"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"}
@@ -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,100 +0,0 @@
1
- import type { Hono } from "hono";
2
- import { MessagingConnector } from "../messaging/base.js";
3
- import type { SessionManager } from "../messaging/session-manager.js";
4
- import type { MessagingConfig } from "../messaging/types.js";
5
- export interface SlackConnectorConfig extends MessagingConfig {
6
- /** Bot User OAuth Token (xoxb-…) — used for all Web API calls (sending). */
7
- botToken: string;
8
- /** How events are received. */
9
- mode: "webhook" | "socket";
10
- /** App-Level Token for Socket Mode (xapp-…). Required when mode === "socket". */
11
- appToken?: string;
12
- /** Events API signing secret. Required when mode === "webhook". */
13
- signingSecret?: string;
14
- /** Channel ID for cron report delivery */
15
- deliveryChannel?: string;
16
- /**
17
- * Shared Hono app to mount `POST /webhooks/slack` on (webhook mode). This is
18
- * the same HTTP server the GitHub webhook + /api/chat already run on. Must be
19
- * present in webhook mode.
20
- */
21
- honoApp?: Hono;
22
- }
23
- /**
24
- * Slack connector. Two receive modes:
25
- *
26
- * - **webhook** (default/prod): the HTTP Events API. Slack POSTs to
27
- * `/webhooks/slack`; we verify the signing-secret signature, answer the
28
- * one-time url_verification handshake, dedup retries by `event_id`, and ack
29
- * within Slack's 3s window while processing async. Slack retries failed
30
- * deliveries, so this is at-least-once — it does not silently drop messages
31
- * the way Socket Mode does.
32
- * - **socket** (dev fallback): Socket Mode over a WebSocket, no public URL
33
- * needed. At-most-once; kept only for local development.
34
- *
35
- * Sending is identical in both modes via a `WebClient`.
36
- *
37
- * Behaviors:
38
- * - DMs: responds to every message (subscribe `message.im` in webhook mode)
39
- * - Channels: only responds when @mentioned (subscribe `app_mention`)
40
- */
41
- export declare class SlackConnector extends MessagingConnector {
42
- readonly name = "slack";
43
- /** Web API client for sending — used in both modes. */
44
- private web;
45
- /** Bolt app — constructed only in socket mode, purely as the receiver. */
46
- private bolt;
47
- private slackConfig;
48
- private userCache;
49
- /** Bounded set of processed Events API delivery ids, to drop Slack retries. */
50
- private seenEventIds;
51
- private seenEventOrder;
52
- constructor(config: SlackConnectorConfig, sessionManager: SessionManager);
53
- start(): Promise<void>;
54
- stop(): Promise<void>;
55
- sendMessage(channelId: string, threadId: string | null, text: string): Promise<string | void>;
56
- /**
57
- * Edit a previously-sent message in place (`chat.update`). Paired with the
58
- * `ts` returned by `sendMessage`, this powers the single in-place status
59
- * checklist (see `src/notify/transports/slack.ts`) so a workflow's progress
60
- * updates one message instead of flooding the thread. Note: `chat.update` is
61
- * silent — it does not re-notify — so a separate terminal message is posted
62
- * at the end for an actual ping.
63
- */
64
- updateMessage(channelId: string, ts: string, text: string): Promise<void>;
65
- addReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
66
- showTyping(channelId: string, messageId: string, threadRootId: string): Promise<void>;
67
- /** Clear the thinking status after processing completes */
68
- clearTyping(channelId: string, threadId: string): Promise<void>;
69
- /** Send a message to the configured delivery channel (for cron reports) */
70
- sendToDeliveryChannel(text: string): Promise<void>;
71
- /**
72
- * Mount `POST /webhooks/slack` on the shared Hono app. Verifies the request
73
- * signature, handles the url_verification handshake, dedups retries, and
74
- * acks fast while processing the event asynchronously.
75
- */
76
- private mountWebhookRoute;
77
- /** Route a raw Events API `event` object to the right handler. */
78
- private dispatchSlackEvent;
79
- /**
80
- * Record an Events API delivery id as seen. Returns true if it was already
81
- * seen (a Slack retry). Bounded to the most recent ~1000 ids.
82
- */
83
- private markSeen;
84
- private setupSocketListeners;
85
- /** A raw Slack `message` event (DM or channel). */
86
- private onMessageEvent;
87
- /** A raw Slack `app_mention` event (always a channel mention). */
88
- private onAppMention;
89
- /** Resolve a Slack user ID to a username (cached) */
90
- private resolveUsername;
91
- }
92
- /**
93
- * Verify a Slack Events API request signature.
94
- *
95
- * Slack signs `v0:{timestamp}:{rawBody}` with the app's signing secret and
96
- * sends it as `x-slack-signature: v0=…`. We recompute and compare in constant
97
- * time, and reject requests whose timestamp is more than 5 minutes off (replay
98
- * protection). `now` is injectable for tests. Exported for unit testing.
99
- */
100
- export declare function verifySlackSignature(body: string, timestamp: string, signature: string, signingSecret: string, now?: number): boolean;