lastlight 0.6.2 → 0.7.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 (343) hide show
  1. package/dist/admin/routes.d.ts +1 -1
  2. package/dist/admin/routes.js +1 -1
  3. package/dist/admin/routes.js.map +1 -1
  4. package/dist/cli/cli-config.js.map +1 -0
  5. package/dist/cli/cli-format.js.map +1 -0
  6. package/dist/{cli-server.d.ts → cli/cli-server.d.ts} +1 -1
  7. package/dist/{cli-server.js → cli/cli-server.js} +2 -2
  8. package/dist/cli/cli-server.js.map +1 -0
  9. package/dist/cli/cli-timeline.js.map +1 -0
  10. package/dist/{cli.js → cli/cli.js} +2 -0
  11. package/dist/cli/cli.js.map +1 -0
  12. package/dist/{fork-cli.d.ts → cli/fork-cli.d.ts} +14 -5
  13. package/dist/{fork-cli.js → cli/fork-cli.js} +86 -16
  14. package/dist/cli/fork-cli.js.map +1 -0
  15. package/dist/{setup.js → cli/setup.js} +1 -1
  16. package/dist/cli/setup.js.map +1 -0
  17. package/dist/{skills-install.js → cli/skills-install.js} +1 -1
  18. package/dist/cli/skills-install.js.map +1 -0
  19. package/dist/config/config-resolve.js.map +1 -0
  20. package/dist/{config.js → config/config.js} +2 -2
  21. package/dist/config/config.js.map +1 -0
  22. package/dist/config/overlay-assets.js.map +1 -0
  23. package/dist/config/overlay-bootstrap.js.map +1 -0
  24. package/dist/connectors/github-webhook.js +5 -0
  25. package/dist/connectors/github-webhook.js.map +1 -1
  26. package/dist/connectors/types.d.ts +2 -0
  27. package/dist/engine/agent-executor.d.ts +8 -17
  28. package/dist/engine/agent-executor.js +35 -306
  29. package/dist/engine/agent-executor.js.map +1 -1
  30. package/dist/engine/{chat-runner.d.ts → chat/chat-runner.d.ts} +2 -2
  31. package/dist/engine/{chat-runner.js → chat/chat-runner.js} +1 -1
  32. package/dist/engine/chat/chat-runner.js.map +1 -0
  33. package/dist/engine/{chat-skills.js → chat/chat-skills.js} +1 -1
  34. package/dist/engine/chat/chat-skills.js.map +1 -0
  35. package/dist/engine/{chat.d.ts → chat/chat.d.ts} +2 -2
  36. package/dist/engine/{chat.js → chat/chat.js} +7 -7
  37. package/dist/engine/chat/chat.js.map +1 -0
  38. package/dist/engine/{message-batcher.d.ts → chat/message-batcher.d.ts} +1 -1
  39. package/dist/engine/chat/message-batcher.js.map +1 -0
  40. package/dist/engine/dispatcher.d.ts +2 -2
  41. package/dist/engine/dispatcher.js +24 -0
  42. package/dist/engine/dispatcher.js.map +1 -1
  43. package/dist/engine/executors/orchestrator.d.ts +81 -0
  44. package/dist/engine/executors/orchestrator.js +340 -0
  45. package/dist/engine/executors/orchestrator.js.map +1 -0
  46. package/dist/engine/executors/shared.d.ts +1 -1
  47. package/dist/engine/github/git-auth.js.map +1 -0
  48. package/dist/engine/github/github-app-client.js.map +1 -0
  49. package/dist/engine/github/github-tools.js.map +1 -0
  50. package/dist/engine/github/github.js.map +1 -0
  51. package/dist/engine/{profiles.d.ts → github/profiles.d.ts} +1 -1
  52. package/dist/engine/{profiles.js → github/profiles.js} +1 -1
  53. package/dist/engine/github/profiles.js.map +1 -0
  54. package/dist/engine/router.js +49 -3
  55. package/dist/engine/router.js.map +1 -1
  56. package/dist/engine/{classifier.d.ts → screen/classifier.d.ts} +11 -1
  57. package/dist/engine/{classifier.js → screen/classifier.js} +45 -1
  58. package/dist/engine/screen/classifier.js.map +1 -0
  59. package/dist/engine/{screen.d.ts → screen/screen.d.ts} +1 -1
  60. package/dist/engine/{screen.js → screen/screen.js} +1 -1
  61. package/dist/engine/screen/screen.js.map +1 -0
  62. package/dist/evals-api.d.ts +3 -3
  63. package/dist/evals-api.js +1 -1
  64. package/dist/evals-api.js.map +1 -1
  65. package/dist/index.js +17 -17
  66. package/dist/index.js.map +1 -1
  67. package/dist/managed-repos.js +1 -1
  68. package/dist/managed-repos.js.map +1 -1
  69. package/dist/notify/transports/github.d.ts +1 -1
  70. package/dist/sandbox/sandbox.d.ts +189 -0
  71. package/dist/sandbox/sandbox.js +429 -0
  72. package/dist/sandbox/sandbox.js.map +1 -0
  73. package/dist/state/workflow-run-store.d.ts +7 -0
  74. package/dist/state/workflow-run-store.js +14 -0
  75. package/dist/state/workflow-run-store.js.map +1 -1
  76. package/dist/telemetry/index.d.ts +1 -1
  77. package/dist/workflows/loader.d.ts +1 -1
  78. package/dist/workflows/phase-executor.d.ts +1 -1
  79. package/dist/workflows/resume.d.ts +3 -3
  80. package/dist/workflows/runner.d.ts +2 -2
  81. package/dist/workflows/runner.js +1 -1
  82. package/dist/workflows/runner.js.map +1 -1
  83. package/dist/workflows/schema.d.ts +2 -2
  84. package/dist/workflows/simple.d.ts +26 -5
  85. package/dist/workflows/simple.js +30 -4
  86. package/dist/workflows/simple.js.map +1 -1
  87. package/dist/workflows/triggers.js +1 -1
  88. package/dist/workflows/triggers.js.map +1 -1
  89. package/docker-compose.yml +1 -1
  90. package/package.json +4 -3
  91. package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lastlight/skills/lastlight-overlay/SKILL.md +7 -1
  93. package/plugins/lastlight/skills/lastlight-overlay/references/forking.md +23 -4
  94. package/skills/README.md +1 -1
  95. package/skills/issue-triage/SKILL.md +34 -7
  96. package/skills/issue-triage/references/AGENT-BRIEF.md +28 -24
  97. package/dist/admin/auth.test.d.ts +0 -1
  98. package/dist/admin/auth.test.js +0 -60
  99. package/dist/admin/auth.test.js.map +0 -1
  100. package/dist/admin/log-search.test.d.ts +0 -1
  101. package/dist/admin/log-search.test.js +0 -78
  102. package/dist/admin/log-search.test.js.map +0 -1
  103. package/dist/admin/routes.test.d.ts +0 -1
  104. package/dist/admin/routes.test.js +0 -877
  105. package/dist/admin/routes.test.js.map +0 -1
  106. package/dist/admin/server-logs.test.d.ts +0 -1
  107. package/dist/admin/server-logs.test.js +0 -58
  108. package/dist/admin/server-logs.test.js.map +0 -1
  109. package/dist/admin/sessions.test.d.ts +0 -1
  110. package/dist/admin/sessions.test.js +0 -78
  111. package/dist/admin/sessions.test.js.map +0 -1
  112. package/dist/admin/version.test.d.ts +0 -1
  113. package/dist/admin/version.test.js +0 -71
  114. package/dist/admin/version.test.js.map +0 -1
  115. package/dist/cli-config.js.map +0 -1
  116. package/dist/cli-config.test.d.ts +0 -1
  117. package/dist/cli-config.test.js +0 -92
  118. package/dist/cli-config.test.js.map +0 -1
  119. package/dist/cli-format.js.map +0 -1
  120. package/dist/cli-server.js.map +0 -1
  121. package/dist/cli-server.test.d.ts +0 -1
  122. package/dist/cli-server.test.js +0 -41
  123. package/dist/cli-server.test.js.map +0 -1
  124. package/dist/cli-timeline.js.map +0 -1
  125. package/dist/cli-timeline.test.d.ts +0 -1
  126. package/dist/cli-timeline.test.js +0 -104
  127. package/dist/cli-timeline.test.js.map +0 -1
  128. package/dist/cli.js.map +0 -1
  129. package/dist/config-overlay.test.d.ts +0 -1
  130. package/dist/config-overlay.test.js +0 -112
  131. package/dist/config-overlay.test.js.map +0 -1
  132. package/dist/config-resolve.js.map +0 -1
  133. package/dist/config-resolve.test.d.ts +0 -1
  134. package/dist/config-resolve.test.js +0 -68
  135. package/dist/config-resolve.test.js.map +0 -1
  136. package/dist/config.js.map +0 -1
  137. package/dist/config.test.d.ts +0 -1
  138. package/dist/config.test.js +0 -288
  139. package/dist/config.test.js.map +0 -1
  140. package/dist/connectors/github-webhook.test.d.ts +0 -1
  141. package/dist/connectors/github-webhook.test.js +0 -156
  142. package/dist/connectors/github-webhook.test.js.map +0 -1
  143. package/dist/connectors/messaging/session-manager.test.d.ts +0 -1
  144. package/dist/connectors/messaging/session-manager.test.js +0 -144
  145. package/dist/connectors/messaging/session-manager.test.js.map +0 -1
  146. package/dist/connectors/slack/connector.test.d.ts +0 -1
  147. package/dist/connectors/slack/connector.test.js +0 -135
  148. package/dist/connectors/slack/connector.test.js.map +0 -1
  149. package/dist/connectors/slack/mrkdwn.test.d.ts +0 -1
  150. package/dist/connectors/slack/mrkdwn.test.js +0 -114
  151. package/dist/connectors/slack/mrkdwn.test.js.map +0 -1
  152. package/dist/cron/fanout.test.d.ts +0 -1
  153. package/dist/cron/fanout.test.js +0 -73
  154. package/dist/cron/fanout.test.js.map +0 -1
  155. package/dist/engine/agent-executor.seam.test.d.ts +0 -1
  156. package/dist/engine/agent-executor.seam.test.js +0 -57
  157. package/dist/engine/agent-executor.seam.test.js.map +0 -1
  158. package/dist/engine/agent-executor.test.d.ts +0 -1
  159. package/dist/engine/agent-executor.test.js +0 -395
  160. package/dist/engine/agent-executor.test.js.map +0 -1
  161. package/dist/engine/chat-runner.js.map +0 -1
  162. package/dist/engine/chat-runner.test.d.ts +0 -1
  163. package/dist/engine/chat-runner.test.js +0 -104
  164. package/dist/engine/chat-runner.test.js.map +0 -1
  165. package/dist/engine/chat-skills.js.map +0 -1
  166. package/dist/engine/chat-skills.test.d.ts +0 -1
  167. package/dist/engine/chat-skills.test.js +0 -20
  168. package/dist/engine/chat-skills.test.js.map +0 -1
  169. package/dist/engine/chat.js.map +0 -1
  170. package/dist/engine/chat.test.d.ts +0 -1
  171. package/dist/engine/chat.test.js +0 -42
  172. package/dist/engine/chat.test.js.map +0 -1
  173. package/dist/engine/classifier.js.map +0 -1
  174. package/dist/engine/classifier.test.d.ts +0 -1
  175. package/dist/engine/classifier.test.js +0 -115
  176. package/dist/engine/classifier.test.js.map +0 -1
  177. package/dist/engine/dispatcher.test.d.ts +0 -1
  178. package/dist/engine/dispatcher.test.js +0 -511
  179. package/dist/engine/dispatcher.test.js.map +0 -1
  180. package/dist/engine/event-shim.test.d.ts +0 -1
  181. package/dist/engine/event-shim.test.js +0 -194
  182. package/dist/engine/event-shim.test.js.map +0 -1
  183. package/dist/engine/executors/backends.d.ts +0 -41
  184. package/dist/engine/executors/backends.js +0 -541
  185. package/dist/engine/executors/backends.js.map +0 -1
  186. package/dist/engine/git-auth.js.map +0 -1
  187. package/dist/engine/git-auth.test.d.ts +0 -1
  188. package/dist/engine/git-auth.test.js +0 -117
  189. package/dist/engine/git-auth.test.js.map +0 -1
  190. package/dist/engine/github-app-client.js.map +0 -1
  191. package/dist/engine/github-app-client.test.d.ts +0 -1
  192. package/dist/engine/github-app-client.test.js +0 -44
  193. package/dist/engine/github-app-client.test.js.map +0 -1
  194. package/dist/engine/github-tools.js.map +0 -1
  195. package/dist/engine/github.js.map +0 -1
  196. package/dist/engine/llm.test.d.ts +0 -1
  197. package/dist/engine/llm.test.js +0 -189
  198. package/dist/engine/llm.test.js.map +0 -1
  199. package/dist/engine/message-batcher.js.map +0 -1
  200. package/dist/engine/message-batcher.test.d.ts +0 -1
  201. package/dist/engine/message-batcher.test.js +0 -109
  202. package/dist/engine/message-batcher.test.js.map +0 -1
  203. package/dist/engine/profiles.js.map +0 -1
  204. package/dist/engine/router.test.d.ts +0 -1
  205. package/dist/engine/router.test.js +0 -695
  206. package/dist/engine/router.test.js.map +0 -1
  207. package/dist/engine/screen.js.map +0 -1
  208. package/dist/engine/screen.test.d.ts +0 -1
  209. package/dist/engine/screen.test.js +0 -82
  210. package/dist/engine/screen.test.js.map +0 -1
  211. package/dist/fork-cli.js.map +0 -1
  212. package/dist/fork-cli.test.d.ts +0 -1
  213. package/dist/fork-cli.test.js +0 -109
  214. package/dist/fork-cli.test.js.map +0 -1
  215. package/dist/managed-repos.test.d.ts +0 -1
  216. package/dist/managed-repos.test.js +0 -39
  217. package/dist/managed-repos.test.js.map +0 -1
  218. package/dist/notify/model.test.d.ts +0 -1
  219. package/dist/notify/model.test.js +0 -109
  220. package/dist/notify/model.test.js.map +0 -1
  221. package/dist/notify/notifier.test.d.ts +0 -1
  222. package/dist/notify/notifier.test.js +0 -100
  223. package/dist/notify/notifier.test.js.map +0 -1
  224. package/dist/notify/render.test.d.ts +0 -1
  225. package/dist/notify/render.test.js +0 -65
  226. package/dist/notify/render.test.js.map +0 -1
  227. package/dist/notify/transports.test.d.ts +0 -1
  228. package/dist/notify/transports.test.js +0 -71
  229. package/dist/notify/transports.test.js.map +0 -1
  230. package/dist/overlay-assets.js.map +0 -1
  231. package/dist/overlay-assets.test.d.ts +0 -1
  232. package/dist/overlay-assets.test.js +0 -75
  233. package/dist/overlay-assets.test.js.map +0 -1
  234. package/dist/overlay-bootstrap.js.map +0 -1
  235. package/dist/overlay-bootstrap.test.d.ts +0 -1
  236. package/dist/overlay-bootstrap.test.js +0 -61
  237. package/dist/overlay-bootstrap.test.js.map +0 -1
  238. package/dist/sandbox/command-exec.integration.test.d.ts +0 -1
  239. package/dist/sandbox/command-exec.integration.test.js +0 -183
  240. package/dist/sandbox/command-exec.integration.test.js.map +0 -1
  241. package/dist/sandbox/docker-compose.test.d.ts +0 -1
  242. package/dist/sandbox/docker-compose.test.js +0 -128
  243. package/dist/sandbox/docker-compose.test.js.map +0 -1
  244. package/dist/sandbox/docker.test.d.ts +0 -1
  245. package/dist/sandbox/docker.test.js +0 -137
  246. package/dist/sandbox/docker.test.js.map +0 -1
  247. package/dist/sandbox/egress-allowlist.test.d.ts +0 -1
  248. package/dist/sandbox/egress-allowlist.test.js +0 -65
  249. package/dist/sandbox/egress-allowlist.test.js.map +0 -1
  250. package/dist/sandbox/egress-firewall-config.test.d.ts +0 -1
  251. package/dist/sandbox/egress-firewall-config.test.js +0 -244
  252. package/dist/sandbox/egress-firewall-config.test.js.map +0 -1
  253. package/dist/sandbox/index.test.d.ts +0 -1
  254. package/dist/sandbox/index.test.js +0 -157
  255. package/dist/sandbox/index.test.js.map +0 -1
  256. package/dist/sandbox/smol.integration.test.d.ts +0 -1
  257. package/dist/sandbox/smol.integration.test.js +0 -130
  258. package/dist/sandbox/smol.integration.test.js.map +0 -1
  259. package/dist/session-log.test.d.ts +0 -1
  260. package/dist/session-log.test.js +0 -85
  261. package/dist/session-log.test.js.map +0 -1
  262. package/dist/setup.js.map +0 -1
  263. package/dist/setup.test.d.ts +0 -1
  264. package/dist/setup.test.js +0 -281
  265. package/dist/setup.test.js.map +0 -1
  266. package/dist/skills-install.js.map +0 -1
  267. package/dist/state/build-assets.test.d.ts +0 -1
  268. package/dist/state/build-assets.test.js +0 -106
  269. package/dist/state/build-assets.test.js.map +0 -1
  270. package/dist/state/db.test.d.ts +0 -1
  271. package/dist/state/db.test.js +0 -484
  272. package/dist/state/db.test.js.map +0 -1
  273. package/dist/state/workflow-run-store.test.d.ts +0 -1
  274. package/dist/state/workflow-run-store.test.js +0 -264
  275. package/dist/state/workflow-run-store.test.js.map +0 -1
  276. package/dist/telemetry/index.test.d.ts +0 -1
  277. package/dist/telemetry/index.test.js +0 -73
  278. package/dist/telemetry/index.test.js.map +0 -1
  279. package/dist/telemetry/pi-events.test.d.ts +0 -1
  280. package/dist/telemetry/pi-events.test.js +0 -69
  281. package/dist/telemetry/pi-events.test.js.map +0 -1
  282. package/dist/workflows/dag.test.d.ts +0 -1
  283. package/dist/workflows/dag.test.js +0 -197
  284. package/dist/workflows/dag.test.js.map +0 -1
  285. package/dist/workflows/golden-build.test.d.ts +0 -1
  286. package/dist/workflows/golden-build.test.js +0 -45
  287. package/dist/workflows/golden-build.test.js.map +0 -1
  288. package/dist/workflows/loader-overlay.test.d.ts +0 -1
  289. package/dist/workflows/loader-overlay.test.js +0 -101
  290. package/dist/workflows/loader-overlay.test.js.map +0 -1
  291. package/dist/workflows/loader.test.d.ts +0 -1
  292. package/dist/workflows/loader.test.js +0 -375
  293. package/dist/workflows/loader.test.js.map +0 -1
  294. package/dist/workflows/loop-eval.test.d.ts +0 -1
  295. package/dist/workflows/loop-eval.test.js +0 -89
  296. package/dist/workflows/loop-eval.test.js.map +0 -1
  297. package/dist/workflows/phase-executor.test.d.ts +0 -1
  298. package/dist/workflows/phase-executor.test.js +0 -497
  299. package/dist/workflows/phase-executor.test.js.map +0 -1
  300. package/dist/workflows/phase-ref.test.d.ts +0 -1
  301. package/dist/workflows/phase-ref.test.js +0 -24
  302. package/dist/workflows/phase-ref.test.js.map +0 -1
  303. package/dist/workflows/runner.test.d.ts +0 -1
  304. package/dist/workflows/runner.test.js +0 -1174
  305. package/dist/workflows/runner.test.js.map +0 -1
  306. package/dist/workflows/simple.test.d.ts +0 -1
  307. package/dist/workflows/simple.test.js +0 -107
  308. package/dist/workflows/simple.test.js.map +0 -1
  309. package/dist/workflows/templates.test.d.ts +0 -1
  310. package/dist/workflows/templates.test.js +0 -258
  311. package/dist/workflows/templates.test.js.map +0 -1
  312. package/dist/workflows/verdict.test.d.ts +0 -1
  313. package/dist/workflows/verdict.test.js +0 -44
  314. package/dist/workflows/verdict.test.js.map +0 -1
  315. package/dist/worktree/manager.test.d.ts +0 -1
  316. package/dist/worktree/manager.test.js +0 -87
  317. package/dist/worktree/manager.test.js.map +0 -1
  318. /package/dist/{cli-config.d.ts → cli/cli-config.d.ts} +0 -0
  319. /package/dist/{cli-config.js → cli/cli-config.js} +0 -0
  320. /package/dist/{cli-format.d.ts → cli/cli-format.d.ts} +0 -0
  321. /package/dist/{cli-format.js → cli/cli-format.js} +0 -0
  322. /package/dist/{cli-timeline.d.ts → cli/cli-timeline.d.ts} +0 -0
  323. /package/dist/{cli-timeline.js → cli/cli-timeline.js} +0 -0
  324. /package/dist/{cli.d.ts → cli/cli.d.ts} +0 -0
  325. /package/dist/{setup.d.ts → cli/setup.d.ts} +0 -0
  326. /package/dist/{skills-install.d.ts → cli/skills-install.d.ts} +0 -0
  327. /package/dist/{config-resolve.d.ts → config/config-resolve.d.ts} +0 -0
  328. /package/dist/{config-resolve.js → config/config-resolve.js} +0 -0
  329. /package/dist/{config.d.ts → config/config.d.ts} +0 -0
  330. /package/dist/{overlay-assets.d.ts → config/overlay-assets.d.ts} +0 -0
  331. /package/dist/{overlay-assets.js → config/overlay-assets.js} +0 -0
  332. /package/dist/{overlay-bootstrap.d.ts → config/overlay-bootstrap.d.ts} +0 -0
  333. /package/dist/{overlay-bootstrap.js → config/overlay-bootstrap.js} +0 -0
  334. /package/dist/engine/{chat-skills.d.ts → chat/chat-skills.d.ts} +0 -0
  335. /package/dist/engine/{message-batcher.js → chat/message-batcher.js} +0 -0
  336. /package/dist/engine/{git-auth.d.ts → github/git-auth.d.ts} +0 -0
  337. /package/dist/engine/{git-auth.js → github/git-auth.js} +0 -0
  338. /package/dist/engine/{github-app-client.d.ts → github/github-app-client.d.ts} +0 -0
  339. /package/dist/engine/{github-app-client.js → github/github-app-client.js} +0 -0
  340. /package/dist/engine/{github-tools.d.ts → github/github-tools.d.ts} +0 -0
  341. /package/dist/engine/{github-tools.js → github/github-tools.js} +0 -0
  342. /package/dist/engine/{github.d.ts → github/github.d.ts} +0 -0
  343. /package/dist/engine/{github.js → github/github.js} +0 -0
@@ -1,135 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { createHmac } from "crypto";
3
- import { Hono } from "hono";
4
- import Database from "better-sqlite3";
5
- import { SlackConnector, verifySlackSignature } from "./connector.js";
6
- import { SessionManager } from "../messaging/session-manager.js";
7
- function sign(secret, ts, body) {
8
- return "v0=" + createHmac("sha256", secret).update(`v0:${ts}:${body}`).digest("hex");
9
- }
10
- describe("verifySlackSignature", () => {
11
- const secret = "shhh-signing-secret";
12
- const body = JSON.stringify({ type: "event_callback", event: { type: "message" } });
13
- const now = 1_700_000_000_000; // fixed clock (ms)
14
- const ts = String(Math.floor(now / 1000));
15
- it("accepts a correctly signed, fresh request", () => {
16
- expect(verifySlackSignature(body, ts, sign(secret, ts, body), secret, now)).toBe(true);
17
- });
18
- it("rejects a signature made with the wrong secret", () => {
19
- expect(verifySlackSignature(body, ts, sign("other-secret", ts, body), secret, now)).toBe(false);
20
- });
21
- it("rejects a tampered body", () => {
22
- expect(verifySlackSignature(body + "x", ts, sign(secret, ts, body), secret, now)).toBe(false);
23
- });
24
- it("rejects a stale timestamp (replay protection)", () => {
25
- const stale = String(Math.floor(now / 1000) - 600); // 10 minutes old
26
- expect(verifySlackSignature(body, stale, sign(secret, stale, body), secret, now)).toBe(false);
27
- });
28
- it("rejects missing signature or timestamp", () => {
29
- expect(verifySlackSignature(body, "", "", secret, now)).toBe(false);
30
- expect(verifySlackSignature(body, ts, "", secret, now)).toBe(false);
31
- });
32
- });
33
- describe("SlackConnector webhook receiver", () => {
34
- const secret = "shhh-signing-secret";
35
- let app;
36
- let conn;
37
- let db;
38
- let events;
39
- function headers(body) {
40
- const ts = String(Math.floor(Date.now() / 1000));
41
- return {
42
- "content-type": "application/json",
43
- "x-slack-request-timestamp": ts,
44
- "x-slack-signature": sign(secret, ts, body),
45
- };
46
- }
47
- const post = (body, hdrs) => app.request("/webhooks/slack", { method: "POST", headers: hdrs ?? headers(body), body });
48
- beforeEach(() => {
49
- app = new Hono();
50
- db = new Database(":memory:");
51
- const sm = new SessionManager(db);
52
- conn = new SlackConnector({
53
- botToken: "xoxb-test",
54
- mode: "webhook",
55
- signingSecret: secret,
56
- honoApp: app,
57
- allowedUsers: [],
58
- botIdentifier: "",
59
- }, sm);
60
- // Stub the Web API client so nothing hits the network during processing.
61
- conn.web = {
62
- users: { info: async () => ({ user: { name: "alice" } }) },
63
- assistant: { threads: { setStatus: async () => { } } },
64
- reactions: { add: async () => { } },
65
- chat: { postMessage: async () => ({ ts: "x" }), update: async () => { } },
66
- };
67
- events = [];
68
- conn.on("event", (e) => events.push(e));
69
- });
70
- afterEach(() => db.close());
71
- it("answers the url_verification handshake", async () => {
72
- const body = JSON.stringify({ type: "url_verification", challenge: "abc123" });
73
- const res = await post(body);
74
- expect(res.status).toBe(200);
75
- expect(await res.json()).toEqual({ challenge: "abc123" });
76
- });
77
- it("rejects a request with a bad signature", async () => {
78
- const body = JSON.stringify({ type: "url_verification", challenge: "x" });
79
- const res = await post(body, {
80
- "content-type": "application/json",
81
- "x-slack-request-timestamp": String(Math.floor(Date.now() / 1000)),
82
- "x-slack-signature": "v0=deadbeef",
83
- });
84
- expect(res.status).toBe(401);
85
- });
86
- it("acks and emits an EventEnvelope for a DM message event", async () => {
87
- const body = JSON.stringify({
88
- type: "event_callback",
89
- event_id: "Ev1",
90
- event: { type: "message", channel: "D1", channel_type: "im", user: "U1", ts: "1.1", text: "hello" },
91
- });
92
- const res = await post(body);
93
- expect(res.status).toBe(200);
94
- // Processing is async (setImmediate) — let it run.
95
- await new Promise((r) => setImmediate(r));
96
- await new Promise((r) => setImmediate(r));
97
- expect(events).toHaveLength(1);
98
- expect(events[0].source).toBe("slack");
99
- expect(events[0].body).toBe("hello");
100
- });
101
- it("dedupes Slack retries by event_id", async () => {
102
- const body = JSON.stringify({
103
- type: "event_callback",
104
- event_id: "Ev-dup",
105
- event: { type: "message", channel: "D1", channel_type: "im", user: "U1", ts: "2.2", text: "once" },
106
- });
107
- expect((await post(body)).status).toBe(200);
108
- await new Promise((r) => setImmediate(r));
109
- await new Promise((r) => setImmediate(r));
110
- expect(events).toHaveLength(1);
111
- // Same event_id again (a Slack retry) → acked but NOT reprocessed.
112
- expect((await post(body)).status).toBe(200);
113
- await new Promise((r) => setImmediate(r));
114
- await new Promise((r) => setImmediate(r));
115
- expect(events).toHaveLength(1);
116
- });
117
- it("ignores message subtypes and bot messages", async () => {
118
- const edited = JSON.stringify({
119
- type: "event_callback",
120
- event_id: "Ev2",
121
- event: { type: "message", subtype: "message_changed", channel: "D1", channel_type: "im", user: "U1", ts: "3.3", text: "edit" },
122
- });
123
- const bot = JSON.stringify({
124
- type: "event_callback",
125
- event_id: "Ev3",
126
- event: { type: "message", channel: "D1", channel_type: "im", bot_id: "B1", ts: "4.4", text: "from a bot" },
127
- });
128
- await post(edited);
129
- await post(bot);
130
- await new Promise((r) => setImmediate(r));
131
- await new Promise((r) => setImmediate(r));
132
- expect(events).toHaveLength(0);
133
- });
134
- });
135
- //# sourceMappingURL=connector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector.test.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,114 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { markdownToSlackMrkdwn } from './mrkdwn.js';
3
- describe('markdownToSlackMrkdwn', () => {
4
- it('converts h1 headers to bold', () => {
5
- expect(markdownToSlackMrkdwn('# Hello World')).toBe('*Hello World*');
6
- });
7
- it('converts h2 headers to bold', () => {
8
- expect(markdownToSlackMrkdwn('## Section Title')).toBe('*Section Title*');
9
- });
10
- it('converts h6 headers to bold', () => {
11
- expect(markdownToSlackMrkdwn('###### Deep Header')).toBe('*Deep Header*');
12
- });
13
- it('converts **bold** to *bold*', () => {
14
- expect(markdownToSlackMrkdwn('This is **bold** text')).toBe('This is *bold* text');
15
- });
16
- it('converts __bold__ to *bold*', () => {
17
- expect(markdownToSlackMrkdwn('This is __bold__ text')).toBe('This is *bold* text');
18
- });
19
- it('converts ~~strikethrough~~ to ~strikethrough~', () => {
20
- expect(markdownToSlackMrkdwn('This is ~~struck~~ text')).toBe('This is ~struck~ text');
21
- });
22
- it('converts [text](url) links to <url|text>', () => {
23
- expect(markdownToSlackMrkdwn('[GitHub](https://github.com)')).toBe('<https://github.com|GitHub>');
24
- });
25
- it('converts ![alt](url) images to <url|alt>', () => {
26
- expect(markdownToSlackMrkdwn('![logo](https://example.com/img.png)')).toBe('<https://example.com/img.png|logo>');
27
- });
28
- it('converts --- horizontal rule to ———', () => {
29
- expect(markdownToSlackMrkdwn('---')).toBe('———');
30
- });
31
- it('converts *** horizontal rule to ———', () => {
32
- expect(markdownToSlackMrkdwn('***')).toBe('———');
33
- });
34
- it('preserves fenced code blocks', () => {
35
- const input = '```typescript\nconst x = 1;\n```';
36
- const result = markdownToSlackMrkdwn(input);
37
- expect(result).toContain('const x = 1;');
38
- // Code content not transformed
39
- expect(result).not.toContain('*typescript*');
40
- });
41
- it('preserves inline code', () => {
42
- const input = 'Use `npm install` to install';
43
- const result = markdownToSlackMrkdwn(input);
44
- expect(result).toBe('Use `npm install` to install');
45
- });
46
- it('does not transform bold markers inside code blocks', () => {
47
- const input = '```\n**not bold**\n```';
48
- const result = markdownToSlackMrkdwn(input);
49
- expect(result).toContain('**not bold**');
50
- });
51
- it('handles combined transformations', () => {
52
- const input = '## Title\n\nThis is **bold** and ~~struck~~.\n\n[Link](https://example.com)';
53
- const result = markdownToSlackMrkdwn(input);
54
- expect(result).toContain('*Title*');
55
- expect(result).toContain('*bold*');
56
- expect(result).toContain('~struck~');
57
- expect(result).toContain('<https://example.com|Link>');
58
- });
59
- it('images before links so images are processed correctly', () => {
60
- const input = '![alt](https://img.example.com) and [text](https://link.example.com)';
61
- const result = markdownToSlackMrkdwn(input);
62
- expect(result).toBe('<https://img.example.com|alt> and <https://link.example.com|text>');
63
- });
64
- describe('GFM tables', () => {
65
- it('renders a table as an aligned monospace code block', () => {
66
- const input = [
67
- '| Feature | Last Light | Eve |',
68
- '|---------|-----------|-----|',
69
- '| Scope | maintenance agent | framework |',
70
- '| Hosting | self-hosted | managed |',
71
- ].join('\n');
72
- const result = markdownToSlackMrkdwn(input);
73
- // Wrapped in a code block so Slack renders it fixed-width.
74
- expect(result.startsWith('```')).toBe(true);
75
- expect(result.trimEnd().endsWith('```')).toBe(true);
76
- // Header present, GFM delimiter pipes gone.
77
- expect(result).toContain('Feature');
78
- expect(result).toContain('Last Light');
79
- expect(result).not.toContain('|');
80
- // The header label and the row value below it start at the same column.
81
- const lines = result.split('\n');
82
- const headerLine = lines.find((l) => l.includes('Last Light'));
83
- const rowLine = lines.find((l) => l.includes('maintenance agent'));
84
- expect(rowLine.indexOf('maintenance agent')).toBe(headerLine.indexOf('Last Light'));
85
- });
86
- it('aligns columns to the widest cell', () => {
87
- const input = '| A | Bbbbb |\n|---|---|\n| ccccc | d |';
88
- const result = markdownToSlackMrkdwn(input);
89
- // "A" padded to width of "ccccc"; two-space gutter between columns.
90
- expect(result).toContain('A Bbbbb');
91
- expect(result).toContain('ccccc d');
92
- });
93
- it('strips inline markdown inside cells', () => {
94
- const input = '| Name | Link |\n|---|---|\n| **bold** | [docs](https://x.io) |';
95
- const result = markdownToSlackMrkdwn(input);
96
- expect(result).toContain('bold');
97
- expect(result).not.toContain('**bold**');
98
- expect(result).toContain('docs (https://x.io)');
99
- });
100
- it('leaves pipe characters inside fenced code blocks alone', () => {
101
- const input = '```\n| not | a | table |\n|---|---|---|\n```';
102
- const result = markdownToSlackMrkdwn(input);
103
- expect(result).toContain('| not | a | table |');
104
- });
105
- it('only converts the table, leaving surrounding prose intact', () => {
106
- const input = 'Here is the comparison:\n\n| X | Y |\n|---|---|\n| 1 | 2 |\n\nThanks!';
107
- const result = markdownToSlackMrkdwn(input);
108
- expect(result).toContain('Here is the comparison:');
109
- expect(result).toContain('Thanks!');
110
- expect(result).toContain('```');
111
- });
112
- });
113
- });
114
- //# sourceMappingURL=mrkdwn.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mrkdwn.test.js","sourceRoot":"","sources":["../../../src/connectors/slack/mrkdwn.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,73 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { dispatchCronWorkflow } from "./fanout.js";
3
- describe("dispatchCronWorkflow", () => {
4
- it("dispatches once when context has no repos[]", async () => {
5
- const dispatch = vi.fn().mockResolvedValue({ success: true });
6
- const res = await dispatchCronWorkflow("repo-health", { repo: "cliftonc/lastlight", mode: "report" }, dispatch);
7
- expect(dispatch).toHaveBeenCalledTimes(1);
8
- expect(dispatch).toHaveBeenCalledWith("repo-health", expect.objectContaining({
9
- repo: "cliftonc/lastlight",
10
- mode: "report",
11
- _triggerType: "cron",
12
- }));
13
- expect(res).toEqual({ dispatched: 1, failures: 0 });
14
- });
15
- it("fans out one dispatch per repo, stripping repos[] and injecting singular repo", async () => {
16
- const dispatch = vi.fn().mockResolvedValue({ success: true });
17
- const repos = ["cliftonc/a", "cliftonc/b", "cliftonc/c"];
18
- const res = await dispatchCronWorkflow("security-review", { repos, mode: "scan", deliverSlackSummary: true }, dispatch);
19
- expect(dispatch).toHaveBeenCalledTimes(3);
20
- const passedRepos = dispatch.mock.calls.map((c) => c[1].repo);
21
- expect(passedRepos.sort()).toEqual(repos.sort());
22
- for (const call of dispatch.mock.calls) {
23
- const ctx = call[1];
24
- expect(ctx.repos).toBeUndefined(); // fan-out strips the array
25
- expect(ctx._triggerType).toBe("cron");
26
- expect(ctx.mode).toBe("scan");
27
- expect(ctx.deliverSlackSummary).toBe(true);
28
- }
29
- expect(res).toEqual({ dispatched: 3, failures: 0 });
30
- });
31
- it("returns zero dispatches when repos[] is empty", async () => {
32
- const dispatch = vi.fn().mockResolvedValue({ success: true });
33
- const res = await dispatchCronWorkflow("security-review", { repos: [] }, dispatch);
34
- expect(dispatch).not.toHaveBeenCalled();
35
- expect(res).toEqual({ dispatched: 0, failures: 0 });
36
- });
37
- it("counts dispatch failures but isolates them (Promise.allSettled)", async () => {
38
- const dispatch = vi.fn()
39
- .mockResolvedValueOnce({ success: true })
40
- .mockResolvedValueOnce({ success: false, error: "boom" })
41
- .mockRejectedValueOnce(new Error("sandbox exploded"));
42
- const res = await dispatchCronWorkflow("security-review", { repos: ["cliftonc/a", "cliftonc/b", "cliftonc/c"] }, dispatch, { concurrency: 3 });
43
- expect(dispatch).toHaveBeenCalledTimes(3);
44
- expect(res).toEqual({ dispatched: 3, failures: 2 });
45
- });
46
- it("counts paused runs as non-failures", async () => {
47
- const dispatch = vi.fn().mockResolvedValue({ success: true, paused: true });
48
- const res = await dispatchCronWorkflow("security-review", { repos: ["cliftonc/a"] }, dispatch);
49
- expect(res).toEqual({ dispatched: 1, failures: 0 });
50
- });
51
- it("bounds concurrency — never more than N dispatches in flight", async () => {
52
- let inFlight = 0;
53
- let peakInFlight = 0;
54
- const dispatch = vi.fn().mockImplementation(async () => {
55
- inFlight++;
56
- peakInFlight = Math.max(peakInFlight, inFlight);
57
- await new Promise((r) => setTimeout(r, 5));
58
- inFlight--;
59
- return { success: true };
60
- });
61
- const repos = Array.from({ length: 10 }, (_, i) => `cliftonc/repo-${i}`);
62
- const res = await dispatchCronWorkflow("security-review", { repos }, dispatch, { concurrency: 3 });
63
- expect(res).toEqual({ dispatched: 10, failures: 0 });
64
- expect(peakInFlight).toBeLessThanOrEqual(3);
65
- });
66
- it("drops non-string entries from repos[] silently", async () => {
67
- const dispatch = vi.fn().mockResolvedValue({ success: true });
68
- const res = await dispatchCronWorkflow("security-review", { repos: ["cliftonc/a", 42, null, "", "cliftonc/b"] }, dispatch);
69
- expect(dispatch).toHaveBeenCalledTimes(2);
70
- expect(res).toEqual({ dispatched: 2, failures: 0 });
71
- });
72
- });
73
- //# sourceMappingURL=fanout.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fanout.test.js","sourceRoot":"","sources":["../../src/cron/fanout.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,57 +0,0 @@
1
- /**
2
- * Core's half of the GitHub-mock seam contract.
3
- *
4
- * The eval harness (now in the separate `lastlight-evals` package) mocks GitHub
5
- * by pointing `ExecutorConfig.githubApiBaseUrl` at an in-process fake and
6
- * trusting that core forwards that base URL into agentic-pi's built-in
7
- * `github_*` tools. The full red→green integration round-trip lives in
8
- * lastlight-evals; THIS test is core's lightweight guard that the one line of
9
- * plumbing still exists — if core ever stops forwarding `githubApiBaseUrl`,
10
- * core's own `npm test` must go red rather than silently breaking every
11
- * downstream eval.
12
- *
13
- * No fake server, no AI, no provider keys: we mock `agentic-pi` so its `run`
14
- * captures its options and throws immediately (the executor's catch path then
15
- * returns a failure result), and assert the captured options carried our URL.
16
- */
17
- import { mkdtempSync, mkdirSync } from "node:fs";
18
- import { tmpdir } from "node:os";
19
- import { join } from "node:path";
20
- import { describe, it, expect, vi, beforeEach } from "vitest";
21
- const runSpy = vi.fn();
22
- // Intercept BOTH the static and the executor's dynamic `import("agentic-pi")`.
23
- vi.mock("agentic-pi", () => ({
24
- run: (opts) => {
25
- runSpy(opts);
26
- // Bail out the moment we've captured the args — we only care about the
27
- // forwarded base URL, not about actually running an agent.
28
- throw new Error("seam-test: stop after capturing run options");
29
- },
30
- }));
31
- // Imported AFTER vi.mock so the dynamic import inside resolves to the mock.
32
- const { executeAgent } = await import("./agent-executor.js");
33
- describe("agentic-pi githubApiBaseUrl seam (core side)", () => {
34
- beforeEach(() => runSpy.mockClear());
35
- it("forwards ExecutorConfig.githubApiBaseUrl into the agentic-pi run", async () => {
36
- const stateDir = mkdtempSync(join(tmpdir(), "ll-seam-"));
37
- const sessionsDir = join(stateDir, "agent-sessions");
38
- // The shim appends per-phase jsonl under <sessionsDir>/projects/<slug>/ and
39
- // does not create that parent recursively.
40
- mkdirSync(join(sessionsDir, "projects"), { recursive: true });
41
- const fakeUrl = "http://127.0.0.1:65535";
42
- // sandbox:"none" + no githubAccess → prepareRun mints no token, runs
43
- // in-process, and reaches the agenticRun call with no network or keys.
44
- const result = await executeAgent("noop prompt", {
45
- sandbox: "none",
46
- stateDir,
47
- sessionsDir,
48
- githubApiBaseUrl: fakeUrl,
49
- });
50
- expect(runSpy).toHaveBeenCalledTimes(1);
51
- expect(runSpy.mock.calls[0][0]).toMatchObject({ githubApiBaseUrl: fakeUrl });
52
- // The mock threw, so the executor returns a failure result — that's fine;
53
- // the contract under test is purely the forwarded URL.
54
- expect(result.success).toBe(false);
55
- });
56
- });
57
- //# sourceMappingURL=agent-executor.seam.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-executor.seam.test.js","sourceRoot":"","sources":["../../src/engine/agent-executor.seam.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEvB,+EAA+E;AAC/E,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;QACrB,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,4EAA4E;AAC5E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAE7D,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAErC,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACrD,4EAA4E;QAC5E,2CAA2C;QAC3C,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACzC,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE;YAC/C,OAAO,EAAE,MAAM;YACf,QAAQ;YACR,WAAW;YACX,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7E,0EAA0E;QAC1E,uDAAuD;QACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};