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,341 +0,0 @@
1
- import { App } from "@slack/bolt";
2
- import { WebClient } from "@slack/web-api";
3
- import { createHmac, timingSafeEqual } from "crypto";
4
- import { MessagingConnector } from "../messaging/base.js";
5
- import { markdownToSlackMrkdwn } from "./mrkdwn.js";
6
- /** Rotating status messages shown while the agent is thinking */
7
- const THINKING_MESSAGES = [
8
- "Thinking...",
9
- "Pondering the cosmos...",
10
- "Consulting the codebase...",
11
- "Rummaging through repos...",
12
- "Brewing a response...",
13
- "Crunching context...",
14
- "Reading between the lines...",
15
- "Warming up the neurons...",
16
- "Assembling thoughts...",
17
- "Almost there...",
18
- ];
19
- /**
20
- * Slack connector. Two receive modes:
21
- *
22
- * - **webhook** (default/prod): the HTTP Events API. Slack POSTs to
23
- * `/webhooks/slack`; we verify the signing-secret signature, answer the
24
- * one-time url_verification handshake, dedup retries by `event_id`, and ack
25
- * within Slack's 3s window while processing async. Slack retries failed
26
- * deliveries, so this is at-least-once — it does not silently drop messages
27
- * the way Socket Mode does.
28
- * - **socket** (dev fallback): Socket Mode over a WebSocket, no public URL
29
- * needed. At-most-once; kept only for local development.
30
- *
31
- * Sending is identical in both modes via a `WebClient`.
32
- *
33
- * Behaviors:
34
- * - DMs: responds to every message (subscribe `message.im` in webhook mode)
35
- * - Channels: only responds when @mentioned (subscribe `app_mention`)
36
- */
37
- export class SlackConnector extends MessagingConnector {
38
- name = "slack";
39
- /** Web API client for sending — used in both modes. */
40
- web;
41
- /** Bolt app — constructed only in socket mode, purely as the receiver. */
42
- bolt = null;
43
- slackConfig;
44
- userCache = new Map(); // userId → username
45
- /** Bounded set of processed Events API delivery ids, to drop Slack retries. */
46
- seenEventIds = new Set();
47
- seenEventOrder = [];
48
- constructor(config, sessionManager) {
49
- super(config, sessionManager);
50
- this.slackConfig = config;
51
- this.web = new WebClient(config.botToken);
52
- if (config.mode === "socket") {
53
- if (!config.appToken)
54
- throw new Error("[slack] socket mode requires appToken");
55
- this.bolt = new App({
56
- token: config.botToken,
57
- appToken: config.appToken,
58
- socketMode: true,
59
- });
60
- this.setupSocketListeners();
61
- }
62
- else {
63
- if (!config.honoApp) {
64
- throw new Error("[slack] webhook mode requires an HTTP server to mount /webhooks/slack on " +
65
- "(none available — is the GitHub webhook connector configured?). " +
66
- "Set SLACK_MODE=socket for a standalone Slack deployment.");
67
- }
68
- if (!config.signingSecret)
69
- throw new Error("[slack] webhook mode requires signingSecret");
70
- this.mountWebhookRoute(config.honoApp);
71
- }
72
- }
73
- async start() {
74
- if (this.bolt) {
75
- await this.bolt.start();
76
- console.log(`[slack] Connected via Socket Mode`);
77
- }
78
- else {
79
- console.log(`[slack] Listening via HTTP Events API at /webhooks/slack`);
80
- }
81
- }
82
- async stop() {
83
- if (this.bolt) {
84
- await this.bolt.stop();
85
- console.log(`[slack] Disconnected`);
86
- }
87
- // Webhook mode shares the GitHub connector's HTTP server; nothing to stop.
88
- }
89
- async sendMessage(channelId, threadId, text) {
90
- const result = await this.web.chat.postMessage({
91
- channel: channelId,
92
- text: markdownToSlackMrkdwn(text),
93
- thread_ts: threadId || undefined,
94
- });
95
- return result.ts;
96
- }
97
- /**
98
- * Edit a previously-sent message in place (`chat.update`). Paired with the
99
- * `ts` returned by `sendMessage`, this powers the single in-place status
100
- * checklist (see `src/notify/transports/slack.ts`) so a workflow's progress
101
- * updates one message instead of flooding the thread. Note: `chat.update` is
102
- * silent — it does not re-notify — so a separate terminal message is posted
103
- * at the end for an actual ping.
104
- */
105
- async updateMessage(channelId, ts, text) {
106
- await this.web.chat.update({
107
- channel: channelId,
108
- ts,
109
- text: markdownToSlackMrkdwn(text),
110
- });
111
- }
112
- async addReaction(channelId, messageId, emoji) {
113
- try {
114
- await this.web.reactions.add({
115
- channel: channelId,
116
- timestamp: messageId,
117
- name: emoji,
118
- });
119
- }
120
- catch {
121
- // Reaction may already exist or be invalid — non-critical
122
- }
123
- }
124
- async showTyping(channelId, messageId, threadRootId) {
125
- // Use Slack's assistant.threads.setStatus with rotating fun messages.
126
- // thread_ts MUST be the thread root — passing the new reply's ts in an
127
- // existing thread silently errors and the indicator never shows.
128
- try {
129
- await this.web.assistant.threads.setStatus({
130
- channel_id: channelId,
131
- thread_ts: threadRootId,
132
- status: "Thinking...",
133
- loading_messages: THINKING_MESSAGES,
134
- });
135
- }
136
- catch {
137
- // Assistant API not available — fall back to an emoji reaction on
138
- // the user's actual message (not the thread root).
139
- await this.addReaction(channelId, messageId, "eyes");
140
- }
141
- }
142
- /** Clear the thinking status after processing completes */
143
- async clearTyping(channelId, threadId) {
144
- try {
145
- await this.web.assistant.threads.setStatus({
146
- channel_id: channelId,
147
- thread_ts: threadId,
148
- status: "",
149
- });
150
- }
151
- catch {
152
- // Non-critical — status will clear on its own
153
- }
154
- }
155
- /** Send a message to the configured delivery channel (for cron reports) */
156
- async sendToDeliveryChannel(text) {
157
- if (!this.slackConfig.deliveryChannel) {
158
- console.warn("[slack] No delivery channel configured");
159
- return;
160
- }
161
- const chunks = this.chunkMessage(text);
162
- for (const chunk of chunks) {
163
- await this.sendMessage(this.slackConfig.deliveryChannel, null, chunk);
164
- }
165
- }
166
- // ── Webhook (HTTP Events API) receiver ─────────────────────────────────
167
- /**
168
- * Mount `POST /webhooks/slack` on the shared Hono app. Verifies the request
169
- * signature, handles the url_verification handshake, dedups retries, and
170
- * acks fast while processing the event asynchronously.
171
- */
172
- mountWebhookRoute(app) {
173
- app.post("/webhooks/slack", async (c) => {
174
- const body = await c.req.text();
175
- const timestamp = c.req.header("x-slack-request-timestamp") || "";
176
- const signature = c.req.header("x-slack-signature") || "";
177
- if (!verifySlackSignature(body, timestamp, signature, this.slackConfig.signingSecret)) {
178
- return c.json({ error: "Invalid signature" }, 401);
179
- }
180
- let payload;
181
- try {
182
- payload = JSON.parse(body);
183
- }
184
- catch {
185
- return c.json({ error: "Invalid JSON" }, 400);
186
- }
187
- // One-time handshake when (re)configuring the Request URL in the Slack app.
188
- if (payload.type === "url_verification") {
189
- return c.json({ challenge: payload.challenge });
190
- }
191
- if (payload.type === "event_callback") {
192
- const eventId = typeof payload.event_id === "string" ? payload.event_id : undefined;
193
- // Slack retries on any non-200 / >3s; dedup so a retry of an event we
194
- // already accepted is a no-op rather than a double-processed message.
195
- if (eventId && this.markSeen(eventId)) {
196
- return c.body(null, 200);
197
- }
198
- const event = payload.event;
199
- // Ack immediately, process async — never hold the response past 3s or
200
- // Slack will retry (and we'd handle it twice if it slipped past dedup).
201
- setImmediate(() => {
202
- this.dispatchSlackEvent(event).catch((err) => console.error("[slack] event handler error:", err));
203
- });
204
- }
205
- return c.body(null, 200);
206
- });
207
- }
208
- /** Route a raw Events API `event` object to the right handler. */
209
- async dispatchSlackEvent(event) {
210
- if (!event || typeof event !== "object")
211
- return;
212
- if (event.type === "message") {
213
- await this.onMessageEvent(event);
214
- }
215
- else if (event.type === "app_mention") {
216
- await this.onAppMention(event);
217
- }
218
- }
219
- /**
220
- * Record an Events API delivery id as seen. Returns true if it was already
221
- * seen (a Slack retry). Bounded to the most recent ~1000 ids.
222
- */
223
- markSeen(eventId) {
224
- if (this.seenEventIds.has(eventId))
225
- return true;
226
- this.seenEventIds.add(eventId);
227
- this.seenEventOrder.push(eventId);
228
- if (this.seenEventOrder.length > 1000) {
229
- const evicted = this.seenEventOrder.shift();
230
- if (evicted)
231
- this.seenEventIds.delete(evicted);
232
- }
233
- return false;
234
- }
235
- // ── Socket Mode receiver (dev fallback) ────────────────────────────────
236
- setupSocketListeners() {
237
- // Handle all message events (DMs, channels, groups)
238
- this.bolt.message(async ({ message }) => {
239
- await this.onMessageEvent(message);
240
- });
241
- // Handle explicit @mentions (app_mention event)
242
- this.bolt.event("app_mention", async ({ event }) => {
243
- await this.onAppMention(event);
244
- });
245
- }
246
- // ── Shared event handling (both modes feed these) ──────────────────────
247
- /** A raw Slack `message` event (DM or channel). */
248
- async onMessageEvent(msg) {
249
- // Log EVERY inbound message before any filtering. When a DM looks like it
250
- // "dropped" messages, this line tells us whether Slack delivered the event
251
- // at all and, if so, why we ignored it (a subtype like message_changed, a
252
- // bot_id, or empty text) — versus Slack never sending it.
253
- console.log(`[slack] inbound msg ch=${msg.channel ?? "-"} ts=${msg.ts ?? "-"} ` +
254
- `thread_ts=${msg.thread_ts ?? "-"} subtype=${msg.subtype ?? "-"} ` +
255
- `bot_id=${msg.bot_id ?? "-"} channel_type=${msg.channel_type ?? "-"} ` +
256
- `user=${msg.user ?? "-"} hasText=${msg.text ? "y" : "n"}`);
257
- // Filter out non-standard message subtypes (edits, deletes, joins, etc.)
258
- if (msg.subtype)
259
- return;
260
- if (!msg.user || !msg.text)
261
- return;
262
- // Ignore bot messages
263
- if (msg.bot_id)
264
- return;
265
- const username = await this.resolveUsername(msg.user);
266
- const isDM = msg.channel_type === "im";
267
- const isMention = this.config.botIdentifier
268
- ? msg.text.includes(`<@${this.config.botIdentifier}>`)
269
- : false;
270
- await this.handleIncomingMessage({
271
- platformUserId: msg.user,
272
- platformUsername: username,
273
- channelId: msg.channel,
274
- threadId: msg.thread_ts || null,
275
- messageId: msg.ts,
276
- text: msg.text,
277
- isDM,
278
- isMention,
279
- raw: msg,
280
- });
281
- }
282
- /** A raw Slack `app_mention` event (always a channel mention). */
283
- async onAppMention(event) {
284
- if (!event.user || !event.text)
285
- return;
286
- const username = await this.resolveUsername(event.user);
287
- await this.handleIncomingMessage({
288
- platformUserId: event.user,
289
- platformUsername: username,
290
- channelId: event.channel,
291
- threadId: event.thread_ts || null,
292
- messageId: event.ts,
293
- text: event.text,
294
- isDM: false,
295
- isMention: true,
296
- raw: event,
297
- });
298
- }
299
- /** Resolve a Slack user ID to a username (cached) */
300
- async resolveUsername(userId) {
301
- const cached = this.userCache.get(userId);
302
- if (cached)
303
- return cached;
304
- try {
305
- const result = await this.web.users.info({ user: userId });
306
- const username = result.user?.name || result.user?.real_name || userId;
307
- this.userCache.set(userId, username);
308
- return username;
309
- }
310
- catch {
311
- return userId;
312
- }
313
- }
314
- }
315
- /**
316
- * Verify a Slack Events API request signature.
317
- *
318
- * Slack signs `v0:{timestamp}:{rawBody}` with the app's signing secret and
319
- * sends it as `x-slack-signature: v0=…`. We recompute and compare in constant
320
- * time, and reject requests whose timestamp is more than 5 minutes off (replay
321
- * protection). `now` is injectable for tests. Exported for unit testing.
322
- */
323
- export function verifySlackSignature(body, timestamp, signature, signingSecret, now = Date.now()) {
324
- if (!timestamp || !signature || !signingSecret)
325
- return false;
326
- const ts = Number.parseInt(timestamp, 10);
327
- if (!Number.isFinite(ts))
328
- return false;
329
- if (Math.abs(now / 1000 - ts) > 300)
330
- return false; // 5-minute replay window
331
- const expected = "v0=" + createHmac("sha256", signingSecret)
332
- .update(`v0:${timestamp}:${body}`)
333
- .digest("hex");
334
- try {
335
- return timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
336
- }
337
- catch {
338
- return false;
339
- }
340
- }
341
- //# sourceMappingURL=connector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export { SlackConnector, type SlackConnectorConfig } from "./connector.js";
2
- export { markdownToSlackMrkdwn } from "./mrkdwn.js";
@@ -1,3 +0,0 @@
1
- export { SlackConnector } from "./connector.js";
2
- export { markdownToSlackMrkdwn } from "./mrkdwn.js";
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA6B,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Convert standard Markdown to Slack's mrkdwn format.
3
- *
4
- * Uses an extract-then-transform pattern: code blocks and inline code
5
- * are pulled into placeholders first so their contents are never modified,
6
- * then restored after all transformations are applied.
7
- */
8
- export declare function markdownToSlackMrkdwn(text: string): string;
@@ -1,123 +0,0 @@
1
- /** A line of dashes/colons separating a GFM table header from its body. */
2
- const TABLE_DELIMITER = /^\s*\|?\s*:?-{1,}:?\s*(?:\|\s*:?-{1,}:?\s*)*\|?\s*$/;
3
- /** A candidate table row — contains at least one unescaped pipe. */
4
- function isTableRow(line) {
5
- return line.includes("|") && line.trim() !== "";
6
- }
7
- /** Strip leading/trailing pipes and split a GFM row into trimmed cells. */
8
- function splitTableCells(line) {
9
- return line
10
- .trim()
11
- .replace(/^\||\|$/g, "")
12
- .split("|")
13
- .map((c) => c.trim());
14
- }
15
- /**
16
- * Reduce inline markdown inside a table cell to plain text — the table is
17
- * rendered in a monospace code block where `*`, `_`, backticks and link
18
- * syntax wouldn't render, so they'd just be noise.
19
- */
20
- function plainCell(cell) {
21
- return cell
22
- .replace(/\[([^\]]+)\]\(([^)]+)\)/g, "$1 ($2)") // [text](url) → text (url)
23
- .replace(/\*\*(.+?)\*\*/g, "$1")
24
- .replace(/__(.+?)__/g, "$1")
25
- .replace(/~~(.+?)~~/g, "$1")
26
- .replace(/`([^`]+)`/g, "$1")
27
- .replace(/\*(.+?)\*/g, "$1");
28
- }
29
- /**
30
- * Render a GFM table block (header row, delimiter row, then data rows) as an
31
- * aligned monospace code block. Slack has no table mrkdwn, so a raw GFM table
32
- * shows as a wall of pipes; a fixed-width block keeps columns legible.
33
- */
34
- function renderSlackTable(block) {
35
- // Drop the delimiter row (index 1); keep header + data.
36
- const rows = block
37
- .filter((_, idx) => idx !== 1)
38
- .map((line) => splitTableCells(line).map(plainCell));
39
- const colCount = Math.max(...rows.map((r) => r.length));
40
- const widths = [];
41
- for (let c = 0; c < colCount; c++) {
42
- widths[c] = Math.max(...rows.map((r) => (r[c] ?? "").length));
43
- }
44
- const fmtRow = (r) => widths
45
- .map((w, c) => (r[c] ?? "").padEnd(w))
46
- .join(" ")
47
- .replace(/\s+$/, "");
48
- const lines = [fmtRow(rows[0]), widths.map((w) => "-".repeat(w)).join(" ")];
49
- for (let r = 1; r < rows.length; r++)
50
- lines.push(fmtRow(rows[r]));
51
- return "```\n" + lines.join("\n") + "\n```";
52
- }
53
- /**
54
- * Find GFM tables (a row followed by a dash/colon delimiter line, then zero or
55
- * more rows) and replace each with `render(block)`. Operates line-by-line so
56
- * non-table content is untouched.
57
- */
58
- function convertMarkdownTables(text, render) {
59
- const lines = text.split("\n");
60
- const out = [];
61
- let i = 0;
62
- while (i < lines.length) {
63
- if (i + 1 < lines.length && isTableRow(lines[i]) && TABLE_DELIMITER.test(lines[i + 1])) {
64
- const block = [lines[i], lines[i + 1]];
65
- let j = i + 2;
66
- while (j < lines.length && isTableRow(lines[j]))
67
- block.push(lines[j++]);
68
- out.push(render(block));
69
- i = j;
70
- }
71
- else {
72
- out.push(lines[i]);
73
- i++;
74
- }
75
- }
76
- return out.join("\n");
77
- }
78
- /**
79
- * Convert standard Markdown to Slack's mrkdwn format.
80
- *
81
- * Uses an extract-then-transform pattern: code blocks and inline code
82
- * are pulled into placeholders first so their contents are never modified,
83
- * then restored after all transformations are applied.
84
- */
85
- export function markdownToSlackMrkdwn(text) {
86
- const placeholders = [];
87
- /** Replace a match with a numbered placeholder */
88
- function hold(content) {
89
- const idx = placeholders.length;
90
- placeholders.push(content);
91
- return `\x00PH${idx}\x00`;
92
- }
93
- let out = text;
94
- // 1. Extract fenced code blocks (strip language hints)
95
- out = out.replace(/```[a-zA-Z]*\n([\s\S]*?)```/g, (_m, code) => hold("```\n" + code + "```"));
96
- // 1b. Convert GFM tables to aligned monospace blocks (Slack has no table
97
- // mrkdwn). Runs after fenced-block extraction so pipes inside code are
98
- // left alone, and the result is held so later transforms don't touch it.
99
- out = convertMarkdownTables(out, (block) => hold(renderSlackTable(block)));
100
- // 2. Extract inline code
101
- out = out.replace(/`([^`\n]+)`/g, (_m, code) => hold("`" + code + "`"));
102
- // 3. Headers → bold (Slack has no header mrkdwn)
103
- out = out.replace(/^#{1,6}\s+(.+)$/gm, "*$1*");
104
- // 4. Bold: **text** or __text__ → *text*
105
- out = out.replace(/\*\*(.+?)\*\*/g, "*$1*");
106
- out = out.replace(/__(.+?)__/g, "*$1*");
107
- // 5. Italic: remaining *text* (not preceded/followed by *) → _text_
108
- // Only match single * that aren't part of ** (already converted to single *)
109
- // Skip this — after bold conversion, single * are now bold markers in Slack.
110
- // Markdown _italic_ already works in Slack as italic.
111
- // 6. Strikethrough: ~~text~~ → ~text~
112
- out = out.replace(/~~(.+?)~~/g, "~$1~");
113
- // 7. Images: ![alt](url) → <url|alt> (must come before links)
114
- out = out.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, "<$2|$1>");
115
- // 8. Links: [text](url) → <url|text>
116
- out = out.replace(/\[([^\]]+)\]\(([^)]+)\)/g, "<$2|$1>");
117
- // 9. Horizontal rules → em-dash line
118
- out = out.replace(/^(?:---+|\*\*\*+|___+)\s*$/gm, "———");
119
- // 10. Restore placeholders
120
- out = out.replace(/\x00PH(\d+)\x00/g, (_m, idx) => placeholders[parseInt(idx)]);
121
- return out;
122
- }
123
- //# sourceMappingURL=mrkdwn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mrkdwn.js","sourceRoot":"","sources":["../../../src/connectors/slack/mrkdwn.ts"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- import { EventEmitter } from "events";
2
- /**
3
- * Normalized event envelope — the core engine only sees these,
4
- * never raw platform payloads. Adding a new connector (Slack, Discord, etc.)
5
- * means mapping platform events into this shape.
6
- */
7
- export interface EventEnvelope {
8
- /** Unique event ID (for deduplication) */
9
- id: string;
10
- /** Source connector name */
11
- source: string;
12
- /** Normalized event type */
13
- type: EventType;
14
- /** Repository in owner/repo format */
15
- repo?: string;
16
- /** Issue or PR number */
17
- issueNumber?: number;
18
- /** PR number (distinct from issue for PR-specific events) */
19
- prNumber?: number;
20
- /** Login/username of the sender */
21
- sender: string;
22
- /** Login of the issue/PR original author (distinct from `sender`, the commenter) */
23
- issueAuthor?: string;
24
- /** Whether sender is a bot */
25
- senderIsBot: boolean;
26
- /** Event body text (issue body, comment body, PR body, etc.) */
27
- body: string;
28
- /** Title (for issues/PRs) */
29
- title?: string;
30
- /** Labels on the issue/PR */
31
- labels?: string[];
32
- /** GitHub author association (OWNER, MEMBER, COLLABORATOR, CONTRIBUTOR, NONE) */
33
- authorAssociation?: string;
34
- /** Original platform payload (for connector-specific logic) */
35
- raw: unknown;
36
- /** Reply on the same platform/thread */
37
- reply: (msg: string) => Promise<void>;
38
- /**
39
- * Re-assert a "thinking" indicator for this thread, if the platform has one.
40
- * Called at the start of each turn so a batched burst that drains as multiple
41
- * turns shows the indicator for every turn — the per-arrival show is cleared
42
- * by the first turn's reply. No-op for sources without an indicator (CLI).
43
- */
44
- typing?: () => Promise<void>;
45
- /** Timestamp of the event */
46
- timestamp: Date;
47
- }
48
- export type EventType = "issue.opened" | "issue.reopened" | "issue.closed" | "pr.opened" | "pr.synchronize" | "pr.reopened" | "pr.closed" | "pr.merged" | "comment.created" | "pr_review.submitted" | "pr_review_comment.created" | "message";
49
- /**
50
- * Connector interface — all event sources implement this.
51
- * The core engine registers a handler via on('event', ...) and
52
- * receives EventEnvelopes. It never knows which platform sent them.
53
- */
54
- export interface Connector extends EventEmitter {
55
- /** Connector name (e.g., 'github', 'slack', 'discord') */
56
- readonly name: string;
57
- /** Start listening for events */
58
- start(): Promise<void>;
59
- /** Gracefully stop */
60
- stop(): Promise<void>;
61
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connectors/types.ts"],"names":[],"mappings":""}
@@ -1,33 +0,0 @@
1
- /**
2
- * Cron fan-out: when a cron job context contains a `repos` array, dispatch
3
- * one workflow run per repo instead of passing the array through to a single
4
- * dispatch that expects `context.repo` (singular).
5
- *
6
- * Each per-repo run gets its own workflow_runs row, taskId, sandbox, and
7
- * trigger id, so failures are isolated and the existing per-run resume
8
- * machinery works unchanged.
9
- *
10
- * Concurrency is bounded so 100 repo scans don't spin 100 concurrent
11
- * sandboxes — default is 3, tunable per call.
12
- */
13
- export type CronDispatcher = (workflow: string, context: Record<string, unknown>) => Promise<{
14
- success: boolean;
15
- error?: string;
16
- paused?: boolean;
17
- }>;
18
- export interface FanOutResult {
19
- /** Number of dispatch calls actually made */
20
- dispatched: number;
21
- /** Number that returned !success and !paused (or threw) */
22
- failures: number;
23
- }
24
- export interface FanOutOptions {
25
- /** Max concurrent dispatches. Default 3. */
26
- concurrency?: number;
27
- }
28
- /**
29
- * Dispatch a cron-scheduled workflow, fanning out over `context.repos` when
30
- * present. When absent, behaves like a single dispatch. Always stamps
31
- * `_triggerType: "cron"` on the outgoing context.
32
- */
33
- export declare function dispatchCronWorkflow(workflowName: string, context: Record<string, unknown>, dispatch: CronDispatcher, options?: FanOutOptions): Promise<FanOutResult>;