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,494 +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 { hasMarkdownImage, markdownToSlackBlocks, 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
- /** App-provided hook that routes an approval button click into the dispatcher. */
49
- approvalHandler;
50
- constructor(config, sessionManager) {
51
- super(config, sessionManager);
52
- this.slackConfig = config;
53
- this.web = new WebClient(config.botToken);
54
- if (config.mode === "socket") {
55
- if (!config.appToken)
56
- throw new Error("[slack] socket mode requires appToken");
57
- this.bolt = new App({
58
- token: config.botToken,
59
- appToken: config.appToken,
60
- socketMode: true,
61
- });
62
- this.setupSocketListeners();
63
- }
64
- else {
65
- if (!config.honoApp) {
66
- throw new Error("[slack] webhook mode requires an HTTP server to mount /webhooks/slack on " +
67
- "(none available — is the GitHub webhook connector configured?). " +
68
- "Set SLACK_MODE=socket for a standalone Slack deployment.");
69
- }
70
- if (!config.signingSecret)
71
- throw new Error("[slack] webhook mode requires signingSecret");
72
- this.mountWebhookRoute(config.honoApp);
73
- }
74
- }
75
- /**
76
- * Register the hook that routes an approval button click into the app's
77
- * dispatcher. Wired in `src/index.ts` (after the dispatch deps exist) to the
78
- * same `approval-response` resolution path as the `/approve` slash command.
79
- */
80
- onApprovalAction(handler) {
81
- this.approvalHandler = handler;
82
- // Socket mode needs Bolt action listeners; webhook mode uses the HTTP route.
83
- if (this.bolt)
84
- this.setupInteractionListeners();
85
- }
86
- async start() {
87
- if (this.bolt) {
88
- await this.bolt.start();
89
- console.log(`[slack] Connected via Socket Mode`);
90
- }
91
- else {
92
- console.log(`[slack] Listening via HTTP Events API at /webhooks/slack`);
93
- }
94
- }
95
- async stop() {
96
- if (this.bolt) {
97
- await this.bolt.stop();
98
- console.log(`[slack] Disconnected`);
99
- }
100
- // Webhook mode shares the GitHub connector's HTTP server; nothing to stop.
101
- }
102
- /**
103
- * Post a message. When `blocks` are supplied they carry the rich rendering;
104
- * `text` is still sent as the notification preview + accessibility fallback
105
- * (Slack requires it and truncates it for the push/desktop notification).
106
- * When no explicit blocks are given but the text contains a markdown image,
107
- * the message is auto-promoted to Block Kit so the image renders inline (the
108
- * mrkdwn text path can only downgrade `![alt](url)` to a link); if Slack
109
- * rejects the generated blocks (e.g. an unreachable image URL) it falls back
110
- * to a plain-text post.
111
- */
112
- async sendMessage(channelId, threadId, text, blocks) {
113
- const fallbackText = markdownToSlackMrkdwn(text);
114
- const autoBlocks = !blocks && hasMarkdownImage(text);
115
- const effectiveBlocks = blocks && blocks.length > 0
116
- ? blocks
117
- : autoBlocks
118
- ? markdownToSlackBlocks(text)
119
- : undefined;
120
- try {
121
- const result = await this.web.chat.postMessage({
122
- channel: channelId,
123
- text: fallbackText,
124
- blocks: effectiveBlocks,
125
- thread_ts: threadId || undefined,
126
- });
127
- return result.ts;
128
- }
129
- catch (err) {
130
- // Only auto-generated image blocks are worth retrying without — an
131
- // explicit-blocks caller owns its payload and should see the error.
132
- if (!autoBlocks)
133
- throw err;
134
- console.warn(`[slack] image blocks rejected, falling back to text: ${err instanceof Error ? err.message : String(err)}`);
135
- const result = await this.web.chat.postMessage({
136
- channel: channelId,
137
- text: fallbackText,
138
- thread_ts: threadId || undefined,
139
- });
140
- return result.ts;
141
- }
142
- }
143
- /**
144
- * Edit a previously-sent message in place (`chat.update`). Paired with the
145
- * `ts` returned by `sendMessage`, this powers the single in-place status
146
- * checklist (see `src/notify/transports/slack.ts`) so a workflow's progress
147
- * updates one message instead of flooding the thread. Note: `chat.update` is
148
- * silent — it does not re-notify — so a separate terminal message is posted
149
- * at the end for an actual ping.
150
- */
151
- async updateMessage(channelId, ts, text, blocks) {
152
- const effectiveBlocks = blocks && blocks.length > 0
153
- ? blocks
154
- : hasMarkdownImage(text)
155
- ? markdownToSlackBlocks(text)
156
- : []; // empty array (not undefined) clears any prior blocks on update
157
- await this.web.chat.update({
158
- channel: channelId,
159
- ts,
160
- text: markdownToSlackMrkdwn(text),
161
- blocks: effectiveBlocks,
162
- });
163
- }
164
- async addReaction(channelId, messageId, emoji) {
165
- try {
166
- await this.web.reactions.add({
167
- channel: channelId,
168
- timestamp: messageId,
169
- name: emoji,
170
- });
171
- }
172
- catch {
173
- // Reaction may already exist or be invalid — non-critical
174
- }
175
- }
176
- async showTyping(channelId, messageId, threadRootId) {
177
- // Use Slack's assistant.threads.setStatus with rotating fun messages.
178
- // thread_ts MUST be the thread root — passing the new reply's ts in an
179
- // existing thread silently errors and the indicator never shows.
180
- try {
181
- await this.web.assistant.threads.setStatus({
182
- channel_id: channelId,
183
- thread_ts: threadRootId,
184
- status: "Thinking...",
185
- loading_messages: THINKING_MESSAGES,
186
- });
187
- }
188
- catch {
189
- // Assistant API not available — fall back to an emoji reaction on
190
- // the user's actual message (not the thread root).
191
- await this.addReaction(channelId, messageId, "eyes");
192
- }
193
- }
194
- /** Clear the thinking status after processing completes */
195
- async clearTyping(channelId, threadId) {
196
- try {
197
- await this.web.assistant.threads.setStatus({
198
- channel_id: channelId,
199
- thread_ts: threadId,
200
- status: "",
201
- });
202
- }
203
- catch {
204
- // Non-critical — status will clear on its own
205
- }
206
- }
207
- /** Send a message to the configured delivery channel (for cron reports) */
208
- async sendToDeliveryChannel(text) {
209
- if (!this.slackConfig.deliveryChannel) {
210
- console.warn("[slack] No delivery channel configured");
211
- return;
212
- }
213
- const chunks = this.chunkMessage(text);
214
- for (const chunk of chunks) {
215
- await this.sendMessage(this.slackConfig.deliveryChannel, null, chunk);
216
- }
217
- }
218
- // ── Webhook (HTTP Events API) receiver ─────────────────────────────────
219
- /**
220
- * Mount `POST /webhooks/slack` on the shared Hono app. Verifies the request
221
- * signature, handles the url_verification handshake, dedups retries, and
222
- * acks fast while processing the event asynchronously.
223
- */
224
- mountWebhookRoute(app) {
225
- app.post("/webhooks/slack", async (c) => {
226
- const body = await c.req.text();
227
- const timestamp = c.req.header("x-slack-request-timestamp") || "";
228
- const signature = c.req.header("x-slack-signature") || "";
229
- if (!verifySlackSignature(body, timestamp, signature, this.slackConfig.signingSecret)) {
230
- return c.json({ error: "Invalid signature" }, 401);
231
- }
232
- let payload;
233
- try {
234
- payload = JSON.parse(body);
235
- }
236
- catch {
237
- return c.json({ error: "Invalid JSON" }, 400);
238
- }
239
- // One-time handshake when (re)configuring the Request URL in the Slack app.
240
- if (payload.type === "url_verification") {
241
- return c.json({ challenge: payload.challenge });
242
- }
243
- if (payload.type === "event_callback") {
244
- const eventId = typeof payload.event_id === "string" ? payload.event_id : undefined;
245
- // Slack retries on any non-200 / >3s; dedup so a retry of an event we
246
- // already accepted is a no-op rather than a double-processed message.
247
- if (eventId && this.markSeen(eventId)) {
248
- return c.body(null, 200);
249
- }
250
- const event = payload.event;
251
- // Ack immediately, process async — never hold the response past 3s or
252
- // Slack will retry (and we'd handle it twice if it slipped past dedup).
253
- setImmediate(() => {
254
- this.dispatchSlackEvent(event).catch((err) => console.error("[slack] event handler error:", err));
255
- });
256
- }
257
- return c.body(null, 200);
258
- });
259
- // Interactivity endpoint — Slack POSTs button clicks here as a
260
- // form-encoded `payload=<json>` body (a DIFFERENT Request URL from the
261
- // Events API above, configured under the app's Interactivity settings).
262
- app.post("/webhooks/slack/interactions", async (c) => {
263
- const body = await c.req.text();
264
- const timestamp = c.req.header("x-slack-request-timestamp") || "";
265
- const signature = c.req.header("x-slack-signature") || "";
266
- if (!verifySlackSignature(body, timestamp, signature, this.slackConfig.signingSecret)) {
267
- return c.json({ error: "Invalid signature" }, 401);
268
- }
269
- const raw = new URLSearchParams(body).get("payload");
270
- if (!raw)
271
- return c.body(null, 200);
272
- let payload;
273
- try {
274
- payload = JSON.parse(raw);
275
- }
276
- catch {
277
- return c.json({ error: "Invalid JSON" }, 400);
278
- }
279
- // Ack within Slack's 3s window; resolve the gate asynchronously.
280
- setImmediate(() => {
281
- this.handleInteraction(payload).catch((err) => console.error("[slack] interaction handler error:", err));
282
- });
283
- return c.body(null, 200);
284
- });
285
- }
286
- /** Wire Bolt block-action listeners (socket mode) to the same handler. */
287
- setupInteractionListeners() {
288
- if (!this.bolt)
289
- return;
290
- const handle = async ({ ack, body }) => {
291
- await ack();
292
- await this.handleInteraction(body).catch((err) => console.error("[slack] interaction handler error:", err));
293
- };
294
- this.bolt.action("approval_approve", handle);
295
- this.bolt.action("approval_reject", handle);
296
- }
297
- /**
298
- * Resolve an approval button click: rewrite the prompt message to a
299
- * button-free resolved state, then route the decision through the app's
300
- * approval handler (the same path as the `/approve` slash command).
301
- */
302
- async handleInteraction(payload) {
303
- if (!payload || payload.type !== "block_actions")
304
- return;
305
- const action = Array.isArray(payload.actions) ? payload.actions[0] : undefined;
306
- const actionId = action?.action_id;
307
- if (actionId !== "approval_approve" && actionId !== "approval_reject")
308
- return;
309
- const channelId = payload.channel?.id;
310
- const messageTs = payload.message?.ts;
311
- const threadTs = payload.message?.thread_ts;
312
- const workflowRunId = typeof action?.value === "string" ? action.value : "";
313
- // Dedup Slack retries of the same interaction (at-least-once, like events).
314
- const dedupKey = `interaction:${payload.trigger_id ?? `${channelId}:${messageTs}:${actionId}`}`;
315
- if (this.markSeen(dedupKey))
316
- return;
317
- if (!workflowRunId || !this.approvalHandler)
318
- return;
319
- const decision = actionId === "approval_approve" ? "approved" : "rejected";
320
- const sender = await this.resolveUsername(payload.user?.id ?? "");
321
- // Rewrite the original message so the buttons can't be clicked twice.
322
- await this.resolveApprovalMessage(payload, decision, sender).catch(() => { });
323
- // Build a minimal envelope whose reply() posts a confirmation in-thread.
324
- const replyThread = threadTs || messageTs || null;
325
- const envelope = {
326
- id: `slack-approval-${messageTs ?? workflowRunId}`,
327
- source: this.name,
328
- type: "message",
329
- sender,
330
- senderIsBot: false,
331
- body: decision === "approved" ? "approve" : "reject",
332
- raw: { channelId, threadId: replyThread, approvalAction: { decision, workflowRunId } },
333
- reply: async (msg) => {
334
- if (channelId)
335
- await this.sendMessage(channelId, replyThread, msg);
336
- },
337
- timestamp: new Date(),
338
- };
339
- await this.approvalHandler({ decision, workflowRunId, sender, envelope });
340
- }
341
- /** Rewrite an approval prompt to a resolved, button-free state. */
342
- async resolveApprovalMessage(payload, decision, sender) {
343
- const channel = payload.channel?.id;
344
- const ts = payload.message?.ts;
345
- if (!channel || !ts)
346
- return;
347
- const verb = decision === "approved" ? "✅ Approved" : "❌ Rejected";
348
- const original = Array.isArray(payload.message?.blocks) ? payload.message.blocks : [];
349
- // Drop the interactive actions block; append a resolution status line.
350
- const kept = original.filter((b) => b?.type !== "actions");
351
- await this.web.chat.update({
352
- channel,
353
- ts,
354
- text: `${verb} by ${sender}`,
355
- blocks: [
356
- ...kept,
357
- { type: "context", elements: [{ type: "mrkdwn", text: `${verb} by ${sender}` }] },
358
- ],
359
- });
360
- }
361
- /** Route a raw Events API `event` object to the right handler. */
362
- async dispatchSlackEvent(event) {
363
- if (!event || typeof event !== "object")
364
- return;
365
- if (event.type === "message") {
366
- await this.onMessageEvent(event);
367
- }
368
- else if (event.type === "app_mention") {
369
- await this.onAppMention(event);
370
- }
371
- }
372
- /**
373
- * Record an Events API delivery id as seen. Returns true if it was already
374
- * seen (a Slack retry). Bounded to the most recent ~1000 ids.
375
- */
376
- markSeen(eventId) {
377
- if (this.seenEventIds.has(eventId))
378
- return true;
379
- this.seenEventIds.add(eventId);
380
- this.seenEventOrder.push(eventId);
381
- if (this.seenEventOrder.length > 1000) {
382
- const evicted = this.seenEventOrder.shift();
383
- if (evicted)
384
- this.seenEventIds.delete(evicted);
385
- }
386
- return false;
387
- }
388
- // ── Socket Mode receiver (dev fallback) ────────────────────────────────
389
- setupSocketListeners() {
390
- // Handle all message events (DMs, channels, groups)
391
- this.bolt.message(async ({ message }) => {
392
- await this.onMessageEvent(message);
393
- });
394
- // Handle explicit @mentions (app_mention event)
395
- this.bolt.event("app_mention", async ({ event }) => {
396
- await this.onAppMention(event);
397
- });
398
- }
399
- // ── Shared event handling (both modes feed these) ──────────────────────
400
- /** A raw Slack `message` event (DM or channel). */
401
- async onMessageEvent(msg) {
402
- // Log EVERY inbound message before any filtering. When a DM looks like it
403
- // "dropped" messages, this line tells us whether Slack delivered the event
404
- // at all and, if so, why we ignored it (a subtype like message_changed, a
405
- // bot_id, or empty text) — versus Slack never sending it.
406
- console.log(`[slack] inbound msg ch=${msg.channel ?? "-"} ts=${msg.ts ?? "-"} ` +
407
- `thread_ts=${msg.thread_ts ?? "-"} subtype=${msg.subtype ?? "-"} ` +
408
- `bot_id=${msg.bot_id ?? "-"} channel_type=${msg.channel_type ?? "-"} ` +
409
- `user=${msg.user ?? "-"} hasText=${msg.text ? "y" : "n"}`);
410
- // Filter out non-standard message subtypes (edits, deletes, joins, etc.)
411
- if (msg.subtype)
412
- return;
413
- if (!msg.user || !msg.text)
414
- return;
415
- // Ignore bot messages
416
- if (msg.bot_id)
417
- return;
418
- const username = await this.resolveUsername(msg.user);
419
- const isDM = msg.channel_type === "im";
420
- const isMention = this.config.botIdentifier
421
- ? msg.text.includes(`<@${this.config.botIdentifier}>`)
422
- : false;
423
- await this.handleIncomingMessage({
424
- platformUserId: msg.user,
425
- platformUsername: username,
426
- channelId: msg.channel,
427
- threadId: msg.thread_ts || null,
428
- messageId: msg.ts,
429
- text: msg.text,
430
- isDM,
431
- isMention,
432
- raw: msg,
433
- });
434
- }
435
- /** A raw Slack `app_mention` event (always a channel mention). */
436
- async onAppMention(event) {
437
- if (!event.user || !event.text)
438
- return;
439
- const username = await this.resolveUsername(event.user);
440
- await this.handleIncomingMessage({
441
- platformUserId: event.user,
442
- platformUsername: username,
443
- channelId: event.channel,
444
- threadId: event.thread_ts || null,
445
- messageId: event.ts,
446
- text: event.text,
447
- isDM: false,
448
- isMention: true,
449
- raw: event,
450
- });
451
- }
452
- /** Resolve a Slack user ID to a username (cached) */
453
- async resolveUsername(userId) {
454
- const cached = this.userCache.get(userId);
455
- if (cached)
456
- return cached;
457
- try {
458
- const result = await this.web.users.info({ user: userId });
459
- const username = result.user?.name || result.user?.real_name || userId;
460
- this.userCache.set(userId, username);
461
- return username;
462
- }
463
- catch {
464
- return userId;
465
- }
466
- }
467
- }
468
- /**
469
- * Verify a Slack Events API request signature.
470
- *
471
- * Slack signs `v0:{timestamp}:{rawBody}` with the app's signing secret and
472
- * sends it as `x-slack-signature: v0=…`. We recompute and compare in constant
473
- * time, and reject requests whose timestamp is more than 5 minutes off (replay
474
- * protection). `now` is injectable for tests. Exported for unit testing.
475
- */
476
- export function verifySlackSignature(body, timestamp, signature, signingSecret, now = Date.now()) {
477
- if (!timestamp || !signature || !signingSecret)
478
- return false;
479
- const ts = Number.parseInt(timestamp, 10);
480
- if (!Number.isFinite(ts))
481
- return false;
482
- if (Math.abs(now / 1000 - ts) > 300)
483
- return false; // 5-minute replay window
484
- const expected = "v0=" + createHmac("sha256", signingSecret)
485
- .update(`v0:${timestamp}:${body}`)
486
- .digest("hex");
487
- try {
488
- return timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
489
- }
490
- catch {
491
- return false;
492
- }
493
- }
494
- //# sourceMappingURL=connector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAe7F,iEAAiE;AACjE,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,yBAAyB;IACzB,4BAA4B;IAC5B,4BAA4B;IAC5B,uBAAuB;IACvB,sBAAsB;IACtB,8BAA8B;IAC9B,2BAA2B;IAC3B,wBAAwB;IACxB,iBAAiB;CAClB,CAAC;AAqBF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAC3C,IAAI,GAAG,OAAO,CAAC;IACxB,uDAAuD;IAC/C,GAAG,CAAY;IACvB,0EAA0E;IAClE,IAAI,GAAe,IAAI,CAAC;IACxB,WAAW,CAAuB;IAClC,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,oBAAoB;IACnE,+EAA+E;IACvE,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,cAAc,GAAa,EAAE,CAAC;IACtC,kFAAkF;IAC1E,eAAe,CAAkD;IAEzE,YAAY,MAA4B,EAAE,cAA8B;QACtE,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC/E,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;gBAClB,KAAK,EAAE,MAAM,CAAC,QAAQ;gBACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,2EAA2E;oBAC3E,kEAAkE;oBAClE,0DAA0D,CAC3D,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC1F,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,OAAuD;QACtE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,6EAA6E;QAC7E,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QACD,2EAA2E;IAC7E,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,QAAuB,EACvB,IAAY,EACZ,MAAqB;QAErB,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,eAAe,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACjD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAC7B,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC7C,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE,QAAQ,IAAI,SAAS;aACjC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mEAAmE;YACnE,oEAAoE;YACpE,IAAI,CAAC,UAAU;gBAAE,MAAM,GAAG,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,wDAAwD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC7C,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,QAAQ,IAAI,SAAS;aACjC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,EAAU,EACV,IAAY,EACZ,MAAqB;QAErB,MAAM,eAAe,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACjD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAC7B,CAAC,CAAC,EAAE,CAAC,CAAC,gEAAgE;QACxE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,SAAS;YAClB,EAAE;YACF,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC;YACjC,MAAM,EAAE,eAAe;SACxB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAa;QACnE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;gBAC3B,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,SAAS;gBACpB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,SAAiB,EAAE,YAAoB;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,iEAAiE;QACjE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;gBACzC,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,aAAa;gBACrB,gBAAgB,EAAE,iBAAiB;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,mDAAmD;YACnD,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,QAAgB;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;gBACzC,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,QAAQ;gBACnB,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,qBAAqB,CAAC,IAAY;QACtC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,0EAA0E;IAE1E;;;;OAIG;IACK,iBAAiB,CAAC,GAAS;QACjC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;YAClE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,aAAc,CAAC,EAAE,CAAC;gBACvF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,OAAY,CAAC;YACjB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;YAED,4EAA4E;YAC5E,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACxC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpF,sEAAsE;gBACtE,sEAAsE;gBACtE,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;gBAC5B,sEAAsE;gBACtE,wEAAwE;gBACxE,YAAY,CAAC,GAAG,EAAE;oBAChB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3C,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CACnD,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,+DAA+D;QAC/D,uEAAuE;QACvE,wEAAwE;QACxE,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;YAClE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,aAAc,CAAC,EAAE,CAAC;gBACvF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,OAAY,CAAC;YACjB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;YACD,iEAAiE;YACjE,YAAY,CAAC,GAAG,EAAE;gBAChB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5C,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CACzD,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAClE,yBAAyB;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvB,MAAM,MAAM,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAA+C,EAAE,EAAE;YAClF,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CACzD,CAAC;QACJ,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,iBAAiB,CAAC,OAAY;QAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe;YAAE,OAAO;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,MAAM,QAAQ,GAAG,MAAM,EAAE,SAA+B,CAAC;QACzD,IAAI,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,KAAK,iBAAiB;YAAE,OAAO;QAE9E,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,EAAwB,CAAC;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,EAAwB,CAAC;QAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,SAA+B,CAAC;QAClE,MAAM,aAAa,GAAG,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5E,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,eAAe,OAAO,CAAC,UAAU,IAAI,GAAG,SAAS,IAAI,SAAS,IAAI,QAAQ,EAAE,EAAE,CAAC;QAChG,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO;QACpC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAEpD,MAAM,QAAQ,GAAG,QAAQ,KAAK,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,sEAAsE;QACtE,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE7E,yEAAyE;QACzE,MAAM,WAAW,GAAG,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC;QAClD,MAAM,QAAQ,GAAkB;YAC9B,EAAE,EAAE,kBAAkB,SAAS,IAAI,aAAa,EAAE;YAClD,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,IAAI,EAAE,SAAS;YACf,MAAM;YACN,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YACpD,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE;YACtF,KAAK,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC3B,IAAI,SAAS;oBAAE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,mEAAmE;IAC3D,KAAK,CAAC,sBAAsB,CAClC,OAAY,EACZ,QAAiC,EACjC,MAAc;QAEd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,EAAwB,CAAC;QAC1D,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAwB,CAAC;QACrD,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;YAAE,OAAO;QAC5B,MAAM,IAAI,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,uEAAuE;QACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,OAAO;YACP,EAAE;YACF,IAAI,EAAE,GAAG,IAAI,OAAO,MAAM,EAAE;YAC5B,MAAM,EAAE;gBACN,GAAG,IAAI;gBACP,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,MAAM,EAAE,EAAE,CAAC,EAAE;aAClF;SACF,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAC1D,KAAK,CAAC,kBAAkB,CAAC,KAAU;QACzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QAChD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,QAAQ,CAAC,OAAe;QAC9B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC5C,IAAI,OAAO;gBAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0EAA0E;IAElE,oBAAoB;QAC1B,oDAAoD;QACpD,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAc,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAClD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAY,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAE1E,mDAAmD;IAC3C,KAAK,CAAC,cAAc,CAAC,GAAQ;QACnC,0EAA0E;QAC1E,2EAA2E;QAC3E,0EAA0E;QAC1E,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CACT,0BAA0B,GAAG,CAAC,OAAO,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG;YACnE,aAAa,GAAG,CAAC,SAAS,IAAI,GAAG,YAAY,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG;YAClE,UAAU,GAAG,CAAC,MAAM,IAAI,GAAG,iBAAiB,GAAG,CAAC,YAAY,IAAI,GAAG,GAAG;YACtE,QAAQ,GAAG,CAAC,IAAI,IAAI,GAAG,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAC1D,CAAC;QACF,yEAAyE;QACzE,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO;QACnC,sBAAsB;QACtB,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO;QAEvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,KAAK,IAAI,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;YACzC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC;YACtD,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,IAAI,CAAC,qBAAqB,CAAC;YAC/B,cAAc,EAAE,GAAG,CAAC,IAAI;YACxB,gBAAgB,EAAE,QAAQ;YAC1B,SAAS,EAAE,GAAG,CAAC,OAAO;YACtB,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;YAC/B,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI;YACJ,SAAS;YACT,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAC1D,KAAK,CAAC,YAAY,CAAC,KAAU;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO;QAEvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,IAAI,CAAC,qBAAqB,CAAC;YAC/B,cAAc,EAAE,KAAK,CAAC,IAAI;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,SAAS,EAAE,KAAK,CAAC,OAAO;YACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YACjC,SAAS,EAAE,KAAK,CAAC,EAAE;YACnB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,KAAK;SACX,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IAC7C,KAAK,CAAC,eAAe,CAAC,MAAc;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,IAAI,MAAM,CAAC;YACvE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,aAAqB,EACrB,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC,CAAC,yBAAyB;IAE5E,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC;SACzD,MAAM,CAAC,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;SACjC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -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,19 +0,0 @@
1
- import type { KnownBlock } from "@slack/web-api";
2
- /**
3
- * Convert standard Markdown to Slack's mrkdwn format.
4
- *
5
- * Uses an extract-then-transform pattern: code blocks and inline code
6
- * are pulled into placeholders first so their contents are never modified,
7
- * then restored after all transformations are applied.
8
- */
9
- export declare function markdownToSlackMrkdwn(text: string): string;
10
- /** True if the text contains at least one markdown image. */
11
- export declare function hasMarkdownImage(text: string): boolean;
12
- /**
13
- * Convert markdown to Slack Block Kit, promoting markdown images to real
14
- * `image` blocks — the mrkdwn text path can only downgrade `![alt](url)` to a
15
- * link. Text between/around images is rendered as `section` mrkdwn blocks via
16
- * {@link markdownToSlackMrkdwn}. A non-`http(s)` image URL is left as text
17
- * (Slack rejects image blocks with an unusable URL).
18
- */
19
- export declare function markdownToSlackBlocks(markdown: string): KnownBlock[];