lastlight 0.16.0 → 0.16.2

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} +39 -1
  5. package/dist/{cli/cli-server.js → cli-server.js} +105 -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} +9 -7
  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,88 +0,0 @@
1
- /**
2
- * Minimal template engine for workflow prompt files.
3
- *
4
- * Supports:
5
- * {{varName}} — simple variable substitution
6
- * {{slugify varName}} — slugify helper applied to a variable
7
- * {{branchUrl file}} — generate a GitHub branch URL for a file in issueDir
8
- * {{#if varName}}...{{/if}} — conditional blocks (no nesting, truthy check)
9
- */
10
- export interface TemplateContext {
11
- owner: string;
12
- repo: string;
13
- issueNumber: number;
14
- issueTitle: string;
15
- issueBody: string;
16
- issueLabels: string[];
17
- commentBody: string;
18
- sender: string;
19
- branch: string;
20
- taskId: string;
21
- issueDir: string;
22
- bootstrapLabel: string;
23
- /**
24
- * True only in server mode (handoff docs externalized to the Last Light
25
- * store instead of committed into the target repo). Prompts gate their
26
- * `git add .lastlight/ && commit` behind `{{#if !externalizeArtifacts}}`, so
27
- * an absent flag defaults to repo behaviour (commit the docs) — fail-safe for
28
- * any render path that doesn't set it.
29
- */
30
- externalizeArtifacts?: boolean;
31
- /**
32
- * Dashboard base URL (no trailing slash). Used by the `{{artifactUrl file}}`
33
- * helper to build a server-mode dashboard link to a handoff doc. Absent when
34
- * no public URL is configured.
35
- */
36
- publicUrl?: string;
37
- /**
38
- * Public, unauthenticated, image-only base URL for inline screenshot embeds
39
- * in the browser-QA comment (`<publicUrl>/admin/api/public/artifacts/<owner>/
40
- * <repo>/<issueKey>`). The agent appends `/<name>.png` per screenshot. Empty
41
- * string when no public URL is configured — browser-QA prompts then fall back
42
- * to filename-only references via `{{#if !artifactBaseUrl}}`.
43
- */
44
- artifactBaseUrl?: string;
45
- /**
46
- * Id of the approval being created — injected into an approval-gate message's
47
- * render context by `PhaseExecutor.pauseForApproval` so the `{{approvalUrl}}`
48
- * helper can deep-link to the focused approval view.
49
- */
50
- approvalId?: string;
51
- approved?: boolean;
52
- fixCycles?: number;
53
- reviewerNote?: string;
54
- docLinks?: string;
55
- fixCycle?: number;
56
- prNumber?: number;
57
- prTitle?: string;
58
- prBody?: string;
59
- failedChecks?: string;
60
- ciSection?: string;
61
- prePopulateBranch?: string;
62
- contextSnapshot?: string;
63
- iteration?: number;
64
- maxIterations?: number;
65
- previousOutput?: string;
66
- phaseOutputs?: Record<string, unknown>;
67
- /**
68
- * Mutable phase-to-phase state surfaced from `workflow_runs.scratch`.
69
- * Used by the socratic explore loop to accumulate Q&A across reply-gate
70
- * pauses. Templates can read {{scratch.socratic.qa}} etc. via the
71
- * existing two-level dot notation in renderTemplate.
72
- */
73
- scratch?: Record<string, unknown>;
74
- /**
75
- * Non-GitHub trigger id (currently only `slack:{teamId}:{channel}:{thread}`).
76
- * When set, the runner uses this instead of deriving one from
77
- * owner/repo/issueNumber — that gives Slack-initiated workflows a stable
78
- * key to pause/resume on.
79
- */
80
- triggerIdOverride?: string;
81
- [key: string]: unknown;
82
- }
83
- export declare function slugify(text: string): string;
84
- /**
85
- * Render a template string with the given context.
86
- * Processes: {{#if}}, {{slugify}}, {{branchUrl}}, {{varName}}.
87
- */
88
- export declare function renderTemplate(template: string, ctx: TemplateContext): string;
@@ -1,127 +0,0 @@
1
- /**
2
- * Minimal template engine for workflow prompt files.
3
- *
4
- * Supports:
5
- * {{varName}} — simple variable substitution
6
- * {{slugify varName}} — slugify helper applied to a variable
7
- * {{branchUrl file}} — generate a GitHub branch URL for a file in issueDir
8
- * {{#if varName}}...{{/if}} — conditional blocks (no nesting, truthy check)
9
- */
10
- export function slugify(text) {
11
- return text
12
- .toLowerCase()
13
- .replace(/[^a-z0-9]+/g, "-")
14
- .replace(/^-|-$/g, "")
15
- .slice(0, 40);
16
- }
17
- /**
18
- * Render a template string with the given context.
19
- * Processes: {{#if}}, {{slugify}}, {{branchUrl}}, {{varName}}.
20
- */
21
- export function renderTemplate(template, ctx) {
22
- let result = template;
23
- // 0. Phase output substitution: ${phaseName.output} → phaseOutputs[phaseName]
24
- if (ctx.phaseOutputs) {
25
- const phaseOutputs = ctx.phaseOutputs;
26
- result = result.replace(/\$\{(\w+)\.output\}/g, (_match, phaseName) => {
27
- const val = phaseOutputs[phaseName];
28
- if (val === undefined || val === null)
29
- return "";
30
- return typeof val === "string" ? val : String(val?.output ?? JSON.stringify(val));
31
- });
32
- }
33
- // Walk a dotted key like `scratch.socratic.ready` through ctx, falling
34
- // back to ctx.phaseOutputs for the first segment. Returns undefined on
35
- // any missing intermediate.
36
- const walkKey = (key) => {
37
- const parts = key.split(".");
38
- if (parts.length === 1) {
39
- const val = ctx[key];
40
- if (val !== undefined && val !== null)
41
- return val;
42
- return ctx.phaseOutputs?.[key];
43
- }
44
- let cur = ctx[parts[0]];
45
- if (cur === undefined || cur === null)
46
- cur = ctx.phaseOutputs?.[parts[0]];
47
- for (let i = 1; i < parts.length; i++) {
48
- if (cur === null || typeof cur !== "object")
49
- return undefined;
50
- cur = cur[parts[i]];
51
- }
52
- return cur;
53
- };
54
- // 1. Conditional blocks: {{#if varName}}...{{/if}} (supports dot notation).
55
- // Key segments allow hyphens so phase/model keys like `pr-fix` resolve
56
- // (e.g. {{models.pr-fix}}); \w alone would leave them unrendered.
57
- result = result.replace(/\{\{#if\s+(!?)([\w-]+(?:\.[\w-]+)*)\}\}([\s\S]*?)\{\{\/if\}\}/g, (_match, negate, varName, body) => {
58
- const val = walkKey(varName);
59
- // Truthy: non-empty string, non-zero number, non-empty array, true boolean
60
- const truthy = val !== undefined &&
61
- val !== null &&
62
- val !== "" &&
63
- val !== false &&
64
- val !== 0 &&
65
- !(Array.isArray(val) && val.length === 0);
66
- return (negate ? !truthy : truthy) ? body : "";
67
- });
68
- // 2. Slugify helper: {{slugify varName}}
69
- result = result.replace(/\{\{slugify\s+(\w+)\}\}/g, (_match, varName) => {
70
- const val = ctx[varName];
71
- if (val === undefined || val === null)
72
- return "";
73
- return slugify(String(val));
74
- });
75
- // 3. Branch URL helper: {{branchUrl filename}}
76
- // Generates: https://github.com/{owner}/{repo}/blob/{branch}/.lastlight/issue-{N}/{file}
77
- result = result.replace(/\{\{branchUrl\s+(\S+)\}\}/g, (_match, file) => {
78
- const encoded = encodeURIComponent(ctx.branch);
79
- return `https://github.com/${ctx.owner}/${ctx.repo}/blob/${encoded}/${ctx.issueDir}/${file}`;
80
- });
81
- // 3b. Artifact URL helper: {{artifactUrl filename}} — mode-aware link to a
82
- // handoff doc. In repo mode it's identical to {{branchUrl}} (the doc is
83
- // committed on the branch). In server mode the doc lives on the Last Light
84
- // host, so the link points at the admin dashboard's Artifacts view. Falls
85
- // back to the branch URL when no publicUrl is configured so a server-mode
86
- // deploy without PUBLIC_URL still produces a usable (if GitHub-less) link.
87
- result = result.replace(/\{\{artifactUrl\s+(\S+)\}\}/g, (_match, file) => {
88
- const branchHref = `https://github.com/${ctx.owner}/${ctx.repo}/blob/${encodeURIComponent(ctx.branch)}/${ctx.issueDir}/${file}`;
89
- if (!ctx.externalizeArtifacts)
90
- return branchHref;
91
- if (!ctx.publicUrl)
92
- return branchHref;
93
- const issueKey = ctx.issueDir.replace(/^\.lastlight\//, "");
94
- const base = String(ctx.publicUrl).replace(/\/+$/, "");
95
- const q = `repo=${encodeURIComponent(`${ctx.owner}/${ctx.repo}`)}` +
96
- `&key=${encodeURIComponent(issueKey)}` +
97
- `&doc=${encodeURIComponent(file)}`;
98
- return `${base}/admin/?tab=artifacts&${q}`;
99
- });
100
- // 3c. Approval URL helper: {{approvalUrl}} — deep link to the focused
101
- // approval view for the gate currently being rendered. `approvalId` is
102
- // injected into the message context by PhaseExecutor.pauseForApproval, and
103
- // `publicUrl` is the dashboard base. Renders empty when either is absent
104
- // (e.g. no PUBLIC_URL configured) so the rest of the gate message still
105
- // posts cleanly.
106
- result = result.replace(/\{\{approvalUrl\}\}/g, () => {
107
- if (!ctx.publicUrl || !ctx.approvalId)
108
- return "";
109
- const base = String(ctx.publicUrl).replace(/\/+$/, "");
110
- return `${base}/admin/?approval=${encodeURIComponent(String(ctx.approvalId))}`;
111
- });
112
- // 4. Simple variable substitution: {{varName}} and {{a.b.c...}}.
113
- // Dotted access first checks top-level ctx, then falls back to
114
- // ctx.phaseOutputs[parent] for the first segment so YAML phases can
115
- // emit structured output via `output_var` and downstream prompts can
116
- // read it directly — and the socratic explore loop can read
117
- // {{scratch.socratic.qa}}.
118
- // Key segments allow hyphens (e.g. {{models.pr-fix}}) — see #1.
119
- result = result.replace(/\{\{([\w-]+(?:\.[\w-]+)*)\}\}/g, (_match, key) => {
120
- const val = walkKey(key);
121
- if (val === undefined || val === null)
122
- return "";
123
- return typeof val === "object" ? JSON.stringify(val) : String(val);
124
- });
125
- return result;
126
- }
127
- //# sourceMappingURL=templates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/workflows/templates.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- export type TriggerInfo = {
2
- kind: "cron";
3
- name: string;
4
- schedule: string;
5
- } | {
6
- kind: "github";
7
- event: string;
8
- description: string;
9
- } | {
10
- kind: "slack";
11
- command: string;
12
- description: string;
13
- } | {
14
- kind: "mention";
15
- description: string;
16
- } | {
17
- kind: "internal";
18
- description: string;
19
- };
20
- export declare function getWorkflowTriggers(workflowName: string): TriggerInfo[];
21
- export declare function getWorkflowTriggerKinds(workflowName: string): TriggerInfo["kind"][];
@@ -1,45 +0,0 @@
1
- import { getCronWorkflows } from "./loader.js";
2
- import { getRoutes, getBotName } from "../config/config.js";
3
- function add(map, name, info) {
4
- if (!name)
5
- return;
6
- const effectiveName = name === "github-orchestrator" ? "build" : name;
7
- map.set(effectiveName, [...(map.get(effectiveName) || []), info]);
8
- }
9
- function routeTriggers() {
10
- const routes = getRoutes();
11
- const bot = `@${getBotName()}`;
12
- const map = new Map();
13
- add(map, routes.github.issue_opened, { kind: "github", event: "issue.opened", description: "An issue is opened" });
14
- add(map, routes.github.issue_reopened, { kind: "github", event: "issue.reopened", description: "An issue is reopened" });
15
- add(map, routes.github.pr_opened, { kind: "github", event: "pr.opened", description: "A PR is opened" });
16
- add(map, routes.github.pr_synchronize, { kind: "github", event: "pr.synchronize", description: "A PR is updated" });
17
- add(map, routes.github.pr_reopened, { kind: "github", event: "pr.reopened", description: "A PR is reopened" });
18
- add(map, routes.github.pr_fix, { kind: "mention", description: `\`${bot} build …\` on a PR comment (maintainers only)` });
19
- add(map, routes.github.pr_comment, { kind: "mention", description: `\`${bot} <message>\` on a PR comment / review` });
20
- add(map, routes.github.issue_build, { kind: "mention", description: `\`${bot} build …\` on an issue comment (maintainers only)` });
21
- add(map, routes.github.issue_explore, { kind: "mention", description: `\`${bot} explore …\` on an issue comment` });
22
- add(map, routes.github.issue_comment, { kind: "mention", description: `\`${bot} <message>\` on an issue comment` });
23
- add(map, routes.github.security_feedback, { kind: "internal", description: "Chained from `security-review` when issues are found" });
24
- add(map, routes.slack.build, { kind: "slack", command: "build", description: "Slack: `build <repo>#<n>`" });
25
- add(map, routes.slack.triage, { kind: "slack", command: "triage", description: "Slack: `triage <repo>`" });
26
- add(map, routes.slack.review, { kind: "slack", command: "review", description: "Slack: `review <repo>`" });
27
- add(map, routes.slack.security, { kind: "slack", command: "security", description: "Slack: `security <repo>`" });
28
- add(map, routes.slack.explore, { kind: "slack", command: "explore", description: "Slack: `explore <repo>#<n>`" });
29
- return map;
30
- }
31
- export function getWorkflowTriggers(workflowName) {
32
- const cronTriggers = getCronWorkflows()
33
- .filter((c) => c.workflow === workflowName)
34
- .map((c) => ({ kind: "cron", name: c.name, schedule: c.schedule }));
35
- return [...cronTriggers, ...(routeTriggers().get(workflowName) ?? [])];
36
- }
37
- export function getWorkflowTriggerKinds(workflowName) {
38
- const triggers = getWorkflowTriggers(workflowName);
39
- const seen = new Set();
40
- for (const t of triggers)
41
- seen.add(t.kind);
42
- const order = ["cron", "github", "mention", "slack", "internal"];
43
- return order.filter((k) => seen.has(k));
44
- }
45
- //# sourceMappingURL=triggers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/workflows/triggers.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * The single parser for a reviewer phase's verdict.
3
- *
4
- * A reviewer agent is asked to end its output with a `VERDICT:` marker line —
5
- * either `VERDICT: APPROVED` or `VERDICT: REQUEST_CHANGES`. When that marker is
6
- * present we trust it. When it's absent we fall back to a fragile heuristic
7
- * (preserved here exactly as both runner sites had it): treat the output as
8
- * approved only when it does NOT mention `REQUEST_CHANGES` and DOES start with
9
- * `APPROVED`. `viaFallback` lets callers warn when the marker was missing.
10
- *
11
- * Hardening the fallback is deliberately out of scope — this parser is
12
- * behaviour-neutral on verdict semantics.
13
- */
14
- export type ReviewerVerdict = "APPROVED" | "REQUEST_CHANGES";
15
- export interface ParsedVerdict {
16
- verdict: ReviewerVerdict;
17
- viaFallback: boolean;
18
- }
19
- export declare function parseReviewerVerdict(output: string): ParsedVerdict;
@@ -1,30 +0,0 @@
1
- /**
2
- * The single parser for a reviewer phase's verdict.
3
- *
4
- * A reviewer agent is asked to end its output with a `VERDICT:` marker line —
5
- * either `VERDICT: APPROVED` or `VERDICT: REQUEST_CHANGES`. When that marker is
6
- * present we trust it. When it's absent we fall back to a fragile heuristic
7
- * (preserved here exactly as both runner sites had it): treat the output as
8
- * approved only when it does NOT mention `REQUEST_CHANGES` and DOES start with
9
- * `APPROVED`. `viaFallback` lets callers warn when the marker was missing.
10
- *
11
- * Hardening the fallback is deliberately out of scope — this parser is
12
- * behaviour-neutral on verdict semantics.
13
- */
14
- export function parseReviewerVerdict(output) {
15
- const marker = output.match(/^\s*VERDICT:\s*(APPROVED|REQUEST_CHANGES)\s*$/im);
16
- if (marker) {
17
- return {
18
- verdict: marker[1].toUpperCase() === "APPROVED" ? "APPROVED" : "REQUEST_CHANGES",
19
- viaFallback: false,
20
- };
21
- }
22
- const upper = output.toUpperCase();
23
- const hasRequestChanges = /\bREQUEST_CHANGES\b/.test(upper);
24
- const isApproved = !hasRequestChanges && /^APPROVED\b/.test(upper);
25
- return {
26
- verdict: isApproved ? "APPROVED" : "REQUEST_CHANGES",
27
- viaFallback: true,
28
- };
29
- }
30
- //# sourceMappingURL=verdict.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/workflows/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC/E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB;YAChF,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,CAAC,iBAAiB,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB;QACpD,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
@@ -1,43 +0,0 @@
1
- export interface WorktreeInfo {
2
- taskId: string;
3
- path: string;
4
- branch: string;
5
- repo: string;
6
- createdAt: Date;
7
- }
8
- /**
9
- * Manages git worktrees for per-task isolation.
10
- * Each build task gets its own worktree (isolated working directory + branch).
11
- * The Docker container the harness runs in IS the sandbox — worktrees provide
12
- * per-task isolation within that sandbox.
13
- */
14
- export declare class WorktreeManager {
15
- private baseDir;
16
- private active;
17
- constructor(baseDir?: string);
18
- private execGit;
19
- /**
20
- * Create a new worktree for a task.
21
- * Clones the repo first (if not already cloned), then creates a worktree.
22
- */
23
- create(opts: {
24
- taskId: string;
25
- repoUrl: string;
26
- branch: string;
27
- baseBranch?: string;
28
- }): Promise<WorktreeInfo>;
29
- /**
30
- * Get the path for an active worktree.
31
- */
32
- getPath(taskId: string): string | null;
33
- /**
34
- * Cleanup a worktree. Removes the worktree and optionally the branch.
35
- */
36
- cleanup(taskId: string, opts?: {
37
- deleteBranch?: boolean;
38
- }): Promise<void>;
39
- /**
40
- * List all active worktrees.
41
- */
42
- listActive(): WorktreeInfo[];
43
- }
@@ -1,127 +0,0 @@
1
- import { execFileSync } from "child_process";
2
- import { existsSync, mkdirSync, rmSync } from "fs";
3
- import { join, resolve } from "path";
4
- const WORKTREE_DIR = ".worktrees";
5
- /**
6
- * Manages git worktrees for per-task isolation.
7
- * Each build task gets its own worktree (isolated working directory + branch).
8
- * The Docker container the harness runs in IS the sandbox — worktrees provide
9
- * per-task isolation within that sandbox.
10
- */
11
- export class WorktreeManager {
12
- baseDir;
13
- active = new Map();
14
- constructor(baseDir) {
15
- this.baseDir = baseDir || resolve(WORKTREE_DIR);
16
- }
17
- execGit(args, opts) {
18
- return execFileSync("git", args, { encoding: "utf-8", stdio: "pipe", ...opts });
19
- }
20
- /**
21
- * Create a new worktree for a task.
22
- * Clones the repo first (if not already cloned), then creates a worktree.
23
- */
24
- async create(opts) {
25
- const { taskId, repoUrl, branch, baseBranch } = opts;
26
- if (this.active.has(taskId)) {
27
- return this.active.get(taskId);
28
- }
29
- const worktreePath = join(this.baseDir, taskId);
30
- // Ensure base directory exists
31
- if (!existsSync(this.baseDir)) {
32
- mkdirSync(this.baseDir, { recursive: true });
33
- }
34
- // We need a bare/normal repo to create worktrees from.
35
- // Use a shared bare clone per repo to avoid re-cloning each time.
36
- const repoName = repoUrl.replace(/.*\/([^/]+?)(?:\.git)?$/, "$1");
37
- const bareDir = join(this.baseDir, `.bare-${repoName}`);
38
- if (!existsSync(bareDir)) {
39
- console.log(`[worktree] Bare clone: ${repoUrl}`);
40
- this.execGit(["clone", "--bare", repoUrl, bareDir]);
41
- }
42
- else {
43
- // Fetch latest
44
- this.execGit(["-C", bareDir, "fetch", "--all", "--prune"]);
45
- }
46
- // Create worktree with new branch from base
47
- const base = baseBranch || "main";
48
- const baseRef = `origin/${base}`;
49
- // Check if branch already exists remotely
50
- let branchExists = false;
51
- try {
52
- this.execGit(["-C", bareDir, "rev-parse", "--verify", `origin/${branch}`]);
53
- branchExists = true;
54
- }
55
- catch {
56
- // Branch doesn't exist remotely — that's fine
57
- }
58
- if (branchExists) {
59
- // Resume existing branch
60
- console.log(`[worktree] Resuming branch: ${branch}`);
61
- this.execGit(["-C", bareDir, "worktree", "add", worktreePath, `origin/${branch}`]);
62
- this.execGit(["-C", worktreePath, "checkout", "-B", branch, `origin/${branch}`]);
63
- }
64
- else {
65
- // Create new branch from base
66
- console.log(`[worktree] New branch: ${branch} from ${baseRef}`);
67
- this.execGit(["-C", bareDir, "worktree", "add", "-b", branch, worktreePath, baseRef]);
68
- }
69
- const info = {
70
- taskId,
71
- path: worktreePath,
72
- branch,
73
- repo: repoUrl,
74
- createdAt: new Date(),
75
- };
76
- this.active.set(taskId, info);
77
- return info;
78
- }
79
- /**
80
- * Get the path for an active worktree.
81
- */
82
- getPath(taskId) {
83
- return this.active.get(taskId)?.path || null;
84
- }
85
- /**
86
- * Cleanup a worktree. Removes the worktree and optionally the branch.
87
- */
88
- async cleanup(taskId, opts) {
89
- const info = this.active.get(taskId);
90
- if (!info)
91
- return;
92
- const repoName = info.repo.replace(/.*\/([^/]+?)(?:\.git)?$/, "$1");
93
- const bareDir = join(this.baseDir, `.bare-${repoName}`);
94
- try {
95
- // Remove worktree
96
- if (existsSync(info.path)) {
97
- this.execGit(["-C", bareDir, "worktree", "remove", "--force", info.path]);
98
- }
99
- }
100
- catch (err) {
101
- // Force cleanup if git worktree remove fails
102
- if (existsSync(info.path)) {
103
- rmSync(info.path, { recursive: true, force: true });
104
- try {
105
- this.execGit(["-C", bareDir, "worktree", "prune"]);
106
- }
107
- catch { /* best effort */ }
108
- }
109
- }
110
- // Optionally delete the branch
111
- if (opts?.deleteBranch) {
112
- try {
113
- this.execGit(["-C", bareDir, "branch", "-D", info.branch]);
114
- }
115
- catch { /* branch may not exist locally */ }
116
- }
117
- this.active.delete(taskId);
118
- console.log(`[worktree] Cleaned up: ${taskId}`);
119
- }
120
- /**
121
- * List all active worktrees.
122
- */
123
- listActive() {
124
- return Array.from(this.active.values());
125
- }
126
- }
127
- //# sourceMappingURL=manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/worktree/manager.ts"],"names":[],"mappings":"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"}