lastlight 0.1.15 → 0.2.0

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 (478) hide show
  1. package/README.md +265 -118
  2. package/agent-context/rules.md +62 -9
  3. package/agent-context/security.md +69 -0
  4. package/config/default.yaml +89 -0
  5. package/deploy/.env.production.example +20 -2
  6. package/deploy/entrypoint.sh +16 -17
  7. package/deploy/native/README.md +160 -0
  8. package/deploy/native/install.sh +110 -0
  9. package/deploy/native/lastlight.env.example +95 -0
  10. package/deploy/native/lastlight.service +50 -0
  11. package/deploy/sandbox-entrypoint.sh +59 -42
  12. package/dist/admin/auth.d.ts +1 -1
  13. package/dist/admin/auth.js +3 -1
  14. package/dist/admin/auth.js.map +1 -1
  15. package/dist/admin/chat-session-reader.d.ts +11 -14
  16. package/dist/admin/chat-session-reader.js +27 -51
  17. package/dist/admin/chat-session-reader.js.map +1 -1
  18. package/dist/admin/docker.d.ts +37 -0
  19. package/dist/admin/docker.js +86 -1
  20. package/dist/admin/docker.js.map +1 -1
  21. package/dist/admin/index.js +38 -3
  22. package/dist/admin/index.js.map +1 -1
  23. package/dist/admin/log-search.test.d.ts +1 -0
  24. package/dist/admin/log-search.test.js +78 -0
  25. package/dist/admin/log-search.test.js.map +1 -0
  26. package/dist/admin/routes.d.ts +52 -3
  27. package/dist/admin/routes.js +780 -63
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/routes.test.js +680 -14
  30. package/dist/admin/routes.test.js.map +1 -1
  31. package/dist/admin/server-logs.test.d.ts +1 -0
  32. package/dist/admin/server-logs.test.js +58 -0
  33. package/dist/admin/server-logs.test.js.map +1 -0
  34. package/dist/admin/sessions.d.ts +26 -39
  35. package/dist/admin/sessions.js +86 -310
  36. package/dist/admin/sessions.js.map +1 -1
  37. package/dist/admin/sessions.test.d.ts +1 -0
  38. package/dist/admin/sessions.test.js +78 -0
  39. package/dist/admin/sessions.test.js.map +1 -0
  40. package/dist/admin/version.d.ts +15 -0
  41. package/dist/admin/version.js +73 -0
  42. package/dist/admin/version.js.map +1 -0
  43. package/dist/admin/version.test.d.ts +1 -0
  44. package/dist/admin/version.test.js +71 -0
  45. package/dist/admin/version.test.js.map +1 -0
  46. package/dist/cli-config.d.ts +55 -0
  47. package/dist/cli-config.js +119 -0
  48. package/dist/cli-config.js.map +1 -0
  49. package/dist/cli-config.test.d.ts +1 -0
  50. package/dist/cli-config.test.js +92 -0
  51. package/dist/cli-config.test.js.map +1 -0
  52. package/dist/cli-format.d.ts +19 -0
  53. package/dist/cli-format.js +107 -0
  54. package/dist/cli-format.js.map +1 -0
  55. package/dist/cli-server.d.ts +73 -0
  56. package/dist/cli-server.js +347 -0
  57. package/dist/cli-server.js.map +1 -0
  58. package/dist/cli-server.test.d.ts +1 -0
  59. package/dist/cli-server.test.js +38 -0
  60. package/dist/cli-server.test.js.map +1 -0
  61. package/dist/cli-timeline.d.ts +35 -0
  62. package/dist/cli-timeline.js +373 -0
  63. package/dist/cli-timeline.js.map +1 -0
  64. package/dist/cli-timeline.test.d.ts +1 -0
  65. package/dist/cli-timeline.test.js +104 -0
  66. package/dist/cli-timeline.test.js.map +1 -0
  67. package/dist/cli.d.ts +0 -19
  68. package/dist/cli.js +910 -194
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config-overlay.test.d.ts +1 -0
  71. package/dist/config-overlay.test.js +112 -0
  72. package/dist/config-overlay.test.js.map +1 -0
  73. package/dist/config-resolve.d.ts +28 -0
  74. package/dist/config-resolve.js +47 -0
  75. package/dist/config-resolve.js.map +1 -0
  76. package/dist/config-resolve.test.d.ts +1 -0
  77. package/dist/config-resolve.test.js +68 -0
  78. package/dist/config-resolve.test.js.map +1 -0
  79. package/dist/config.d.ts +62 -49
  80. package/dist/config.js +452 -76
  81. package/dist/config.js.map +1 -1
  82. package/dist/config.test.js +201 -32
  83. package/dist/config.test.js.map +1 -1
  84. package/dist/connectors/github-webhook.js +83 -5
  85. package/dist/connectors/github-webhook.js.map +1 -1
  86. package/dist/connectors/github-webhook.test.d.ts +1 -0
  87. package/dist/connectors/github-webhook.test.js +156 -0
  88. package/dist/connectors/github-webhook.test.js.map +1 -0
  89. package/dist/connectors/messaging/session-manager.d.ts +18 -0
  90. package/dist/connectors/messaging/session-manager.js +83 -2
  91. package/dist/connectors/messaging/session-manager.js.map +1 -1
  92. package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
  93. package/dist/connectors/messaging/session-manager.test.js +144 -0
  94. package/dist/connectors/messaging/session-manager.test.js.map +1 -0
  95. package/dist/connectors/slack/connector.d.ts +9 -0
  96. package/dist/connectors/slack/connector.js +15 -0
  97. package/dist/connectors/slack/connector.js.map +1 -1
  98. package/dist/connectors/slack/mrkdwn.js +81 -0
  99. package/dist/connectors/slack/mrkdwn.js.map +1 -1
  100. package/dist/connectors/slack/mrkdwn.test.js +49 -0
  101. package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
  102. package/dist/connectors/types.d.ts +1 -1
  103. package/dist/cron/fanout.d.ts +33 -0
  104. package/dist/cron/fanout.js +55 -0
  105. package/dist/cron/fanout.js.map +1 -0
  106. package/dist/cron/fanout.test.d.ts +1 -0
  107. package/dist/cron/fanout.test.js +73 -0
  108. package/dist/cron/fanout.test.js.map +1 -0
  109. package/dist/cron/jobs.d.ts +5 -0
  110. package/dist/cron/jobs.js +10 -3
  111. package/dist/cron/jobs.js.map +1 -1
  112. package/dist/cron/scheduler.d.ts +12 -0
  113. package/dist/cron/scheduler.js +27 -1
  114. package/dist/cron/scheduler.js.map +1 -1
  115. package/dist/engine/agent-executor.d.ts +158 -0
  116. package/dist/engine/agent-executor.js +1140 -0
  117. package/dist/engine/agent-executor.js.map +1 -0
  118. package/dist/engine/agent-executor.test.d.ts +1 -0
  119. package/dist/engine/agent-executor.test.js +395 -0
  120. package/dist/engine/agent-executor.test.js.map +1 -0
  121. package/dist/engine/chat-runner.d.ts +123 -0
  122. package/dist/engine/chat-runner.js +379 -0
  123. package/dist/engine/chat-runner.js.map +1 -0
  124. package/dist/engine/chat-runner.test.d.ts +1 -0
  125. package/dist/engine/chat-runner.test.js +104 -0
  126. package/dist/engine/chat-runner.test.js.map +1 -0
  127. package/dist/engine/chat-skills.d.ts +45 -0
  128. package/dist/engine/chat-skills.js +184 -0
  129. package/dist/engine/chat-skills.js.map +1 -0
  130. package/dist/engine/chat-skills.test.d.ts +1 -0
  131. package/dist/engine/chat-skills.test.js +20 -0
  132. package/dist/engine/chat-skills.test.js.map +1 -0
  133. package/dist/engine/chat.d.ts +20 -23
  134. package/dist/engine/chat.js +251 -155
  135. package/dist/engine/chat.js.map +1 -1
  136. package/dist/engine/chat.test.d.ts +1 -0
  137. package/dist/engine/chat.test.js +42 -0
  138. package/dist/engine/chat.test.js.map +1 -0
  139. package/dist/engine/classifier.d.ts +35 -2
  140. package/dist/engine/classifier.js +170 -31
  141. package/dist/engine/classifier.js.map +1 -1
  142. package/dist/engine/classifier.test.d.ts +1 -0
  143. package/dist/engine/classifier.test.js +115 -0
  144. package/dist/engine/classifier.test.js.map +1 -0
  145. package/dist/engine/dispatcher.d.ts +60 -0
  146. package/dist/engine/dispatcher.js +601 -0
  147. package/dist/engine/dispatcher.js.map +1 -0
  148. package/dist/engine/dispatcher.test.d.ts +1 -0
  149. package/dist/engine/dispatcher.test.js +511 -0
  150. package/dist/engine/dispatcher.test.js.map +1 -0
  151. package/dist/engine/event-shim.d.ts +117 -0
  152. package/dist/engine/event-shim.js +435 -0
  153. package/dist/engine/event-shim.js.map +1 -0
  154. package/dist/engine/event-shim.test.d.ts +1 -0
  155. package/dist/engine/event-shim.test.js +194 -0
  156. package/dist/engine/event-shim.test.js.map +1 -0
  157. package/dist/engine/git-auth.d.ts +13 -17
  158. package/dist/engine/git-auth.js +99 -42
  159. package/dist/engine/git-auth.js.map +1 -1
  160. package/dist/engine/git-auth.test.d.ts +1 -0
  161. package/dist/engine/git-auth.test.js +117 -0
  162. package/dist/engine/git-auth.test.js.map +1 -0
  163. package/dist/engine/github-app-client.d.ts +7 -0
  164. package/dist/engine/github-app-client.js +16 -0
  165. package/dist/engine/github-app-client.js.map +1 -0
  166. package/dist/engine/github-app-client.test.d.ts +1 -0
  167. package/dist/engine/github-app-client.test.js +44 -0
  168. package/dist/engine/github-app-client.test.js.map +1 -0
  169. package/dist/engine/github-tools.d.ts +12 -0
  170. package/dist/engine/github-tools.js +261 -0
  171. package/dist/engine/github-tools.js.map +1 -0
  172. package/dist/engine/github.d.ts +1027 -43
  173. package/dist/engine/github.js +153 -14
  174. package/dist/engine/github.js.map +1 -1
  175. package/dist/engine/llm.d.ts +47 -0
  176. package/dist/engine/llm.js +221 -0
  177. package/dist/engine/llm.js.map +1 -0
  178. package/dist/engine/llm.test.d.ts +1 -0
  179. package/dist/engine/llm.test.js +189 -0
  180. package/dist/engine/llm.test.js.map +1 -0
  181. package/dist/engine/profiles.d.ts +249 -0
  182. package/dist/engine/profiles.js +42 -0
  183. package/dist/engine/profiles.js.map +1 -0
  184. package/dist/engine/router.d.ts +12 -6
  185. package/dist/engine/router.js +339 -81
  186. package/dist/engine/router.js.map +1 -1
  187. package/dist/engine/router.test.js +428 -78
  188. package/dist/engine/router.test.js.map +1 -1
  189. package/dist/engine/screen.d.ts +41 -0
  190. package/dist/engine/screen.js +93 -0
  191. package/dist/engine/screen.js.map +1 -0
  192. package/dist/engine/screen.test.d.ts +1 -0
  193. package/dist/engine/screen.test.js +82 -0
  194. package/dist/engine/screen.test.js.map +1 -0
  195. package/dist/index.js +377 -432
  196. package/dist/index.js.map +1 -1
  197. package/dist/managed-repos.d.ts +7 -9
  198. package/dist/managed-repos.js +12 -15
  199. package/dist/managed-repos.js.map +1 -1
  200. package/dist/managed-repos.test.js +24 -19
  201. package/dist/managed-repos.test.js.map +1 -1
  202. package/dist/notify/index.d.ts +15 -0
  203. package/dist/notify/index.js +6 -0
  204. package/dist/notify/index.js.map +1 -0
  205. package/dist/notify/model.d.ts +57 -0
  206. package/dist/notify/model.js +89 -0
  207. package/dist/notify/model.js.map +1 -0
  208. package/dist/notify/model.test.d.ts +1 -0
  209. package/dist/notify/model.test.js +109 -0
  210. package/dist/notify/model.test.js.map +1 -0
  211. package/dist/notify/notifier.d.ts +17 -0
  212. package/dist/notify/notifier.js +87 -0
  213. package/dist/notify/notifier.js.map +1 -0
  214. package/dist/notify/notifier.test.d.ts +1 -0
  215. package/dist/notify/notifier.test.js +100 -0
  216. package/dist/notify/notifier.test.js.map +1 -0
  217. package/dist/notify/render.d.ts +21 -0
  218. package/dist/notify/render.js +59 -0
  219. package/dist/notify/render.js.map +1 -0
  220. package/dist/notify/render.test.d.ts +1 -0
  221. package/dist/notify/render.test.js +65 -0
  222. package/dist/notify/render.test.js.map +1 -0
  223. package/dist/notify/transports/github.d.ts +26 -0
  224. package/dist/notify/transports/github.js +26 -0
  225. package/dist/notify/transports/github.js.map +1 -0
  226. package/dist/notify/transports/slack.d.ts +26 -0
  227. package/dist/notify/transports/slack.js +28 -0
  228. package/dist/notify/transports/slack.js.map +1 -0
  229. package/dist/notify/transports.test.d.ts +1 -0
  230. package/dist/notify/transports.test.js +71 -0
  231. package/dist/notify/transports.test.js.map +1 -0
  232. package/dist/notify/types.d.ts +95 -0
  233. package/dist/notify/types.js +16 -0
  234. package/dist/notify/types.js.map +1 -0
  235. package/dist/sandbox/docker-compose.test.d.ts +1 -0
  236. package/dist/sandbox/docker-compose.test.js +128 -0
  237. package/dist/sandbox/docker-compose.test.js.map +1 -0
  238. package/dist/sandbox/docker.d.ts +97 -9
  239. package/dist/sandbox/docker.js +192 -41
  240. package/dist/sandbox/docker.js.map +1 -1
  241. package/dist/sandbox/docker.test.d.ts +1 -0
  242. package/dist/sandbox/docker.test.js +137 -0
  243. package/dist/sandbox/docker.test.js.map +1 -0
  244. package/dist/sandbox/egress-allowlist.d.ts +69 -0
  245. package/dist/sandbox/egress-allowlist.js +164 -0
  246. package/dist/sandbox/egress-allowlist.js.map +1 -0
  247. package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
  248. package/dist/sandbox/egress-allowlist.test.js +65 -0
  249. package/dist/sandbox/egress-allowlist.test.js.map +1 -0
  250. package/dist/sandbox/egress-firewall-config.d.ts +127 -0
  251. package/dist/sandbox/egress-firewall-config.js +434 -0
  252. package/dist/sandbox/egress-firewall-config.js.map +1 -0
  253. package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
  254. package/dist/sandbox/egress-firewall-config.test.js +244 -0
  255. package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
  256. package/dist/sandbox/images.d.ts +23 -0
  257. package/dist/sandbox/images.js +55 -0
  258. package/dist/sandbox/images.js.map +1 -0
  259. package/dist/sandbox/index.d.ts +82 -3
  260. package/dist/sandbox/index.js +223 -93
  261. package/dist/sandbox/index.js.map +1 -1
  262. package/dist/sandbox/index.test.d.ts +1 -0
  263. package/dist/sandbox/index.test.js +157 -0
  264. package/dist/sandbox/index.test.js.map +1 -0
  265. package/dist/session-log.d.ts +63 -0
  266. package/dist/session-log.js +290 -0
  267. package/dist/session-log.js.map +1 -0
  268. package/dist/session-log.test.d.ts +1 -0
  269. package/dist/session-log.test.js +85 -0
  270. package/dist/session-log.test.js.map +1 -0
  271. package/dist/setup.d.ts +30 -1
  272. package/dist/setup.js +241 -25
  273. package/dist/setup.js.map +1 -1
  274. package/dist/setup.test.js +138 -6
  275. package/dist/setup.test.js.map +1 -1
  276. package/dist/state/approval-store.d.ts +86 -0
  277. package/dist/state/approval-store.js +140 -0
  278. package/dist/state/approval-store.js.map +1 -0
  279. package/dist/state/build-assets.d.ts +50 -0
  280. package/dist/state/build-assets.js +154 -0
  281. package/dist/state/build-assets.js.map +1 -0
  282. package/dist/state/build-assets.test.d.ts +1 -0
  283. package/dist/state/build-assets.test.js +106 -0
  284. package/dist/state/build-assets.test.js.map +1 -0
  285. package/dist/state/db.d.ts +65 -333
  286. package/dist/state/db.js +112 -835
  287. package/dist/state/db.js.map +1 -1
  288. package/dist/state/db.test.js +127 -91
  289. package/dist/state/db.test.js.map +1 -1
  290. package/dist/state/execution-store.d.ts +257 -0
  291. package/dist/state/execution-store.js +527 -0
  292. package/dist/state/execution-store.js.map +1 -0
  293. package/dist/state/migrate.d.ts +15 -0
  294. package/dist/state/migrate.js +175 -0
  295. package/dist/state/migrate.js.map +1 -0
  296. package/dist/state/workflow-run-store.d.ts +195 -0
  297. package/dist/state/workflow-run-store.js +363 -0
  298. package/dist/state/workflow-run-store.js.map +1 -0
  299. package/dist/state/workflow-run-store.test.d.ts +1 -0
  300. package/dist/state/workflow-run-store.test.js +264 -0
  301. package/dist/state/workflow-run-store.test.js.map +1 -0
  302. package/dist/telemetry/index.d.ts +38 -0
  303. package/dist/telemetry/index.js +253 -0
  304. package/dist/telemetry/index.js.map +1 -0
  305. package/dist/telemetry/index.test.d.ts +1 -0
  306. package/dist/telemetry/index.test.js +73 -0
  307. package/dist/telemetry/index.test.js.map +1 -0
  308. package/dist/telemetry/pi-events.d.ts +12 -0
  309. package/dist/telemetry/pi-events.js +134 -0
  310. package/dist/telemetry/pi-events.js.map +1 -0
  311. package/dist/telemetry/pi-events.test.d.ts +1 -0
  312. package/dist/telemetry/pi-events.test.js +69 -0
  313. package/dist/telemetry/pi-events.test.js.map +1 -0
  314. package/dist/workflows/dag.d.ts +13 -1
  315. package/dist/workflows/dag.js +7 -3
  316. package/dist/workflows/dag.js.map +1 -1
  317. package/dist/workflows/dag.test.js +22 -0
  318. package/dist/workflows/dag.test.js.map +1 -1
  319. package/dist/workflows/golden-build.test.d.ts +1 -0
  320. package/dist/workflows/golden-build.test.js +45 -0
  321. package/dist/workflows/golden-build.test.js.map +1 -0
  322. package/dist/workflows/loader-overlay.test.d.ts +1 -0
  323. package/dist/workflows/loader-overlay.test.js +101 -0
  324. package/dist/workflows/loader-overlay.test.js.map +1 -0
  325. package/dist/workflows/loader.d.ts +36 -11
  326. package/dist/workflows/loader.js +311 -87
  327. package/dist/workflows/loader.js.map +1 -1
  328. package/dist/workflows/loader.test.js +114 -10
  329. package/dist/workflows/loader.test.js.map +1 -1
  330. package/dist/workflows/loop-eval.js +2 -0
  331. package/dist/workflows/loop-eval.js.map +1 -1
  332. package/dist/workflows/loop-eval.test.js +14 -0
  333. package/dist/workflows/loop-eval.test.js.map +1 -1
  334. package/dist/workflows/phase-executor.d.ts +145 -0
  335. package/dist/workflows/phase-executor.js +691 -0
  336. package/dist/workflows/phase-executor.js.map +1 -0
  337. package/dist/workflows/phase-executor.test.d.ts +1 -0
  338. package/dist/workflows/phase-executor.test.js +434 -0
  339. package/dist/workflows/phase-executor.test.js.map +1 -0
  340. package/dist/workflows/phase-ref.d.ts +44 -0
  341. package/dist/workflows/phase-ref.js +78 -0
  342. package/dist/workflows/phase-ref.js.map +1 -0
  343. package/dist/workflows/phase-ref.test.d.ts +1 -0
  344. package/dist/workflows/phase-ref.test.js +24 -0
  345. package/dist/workflows/phase-ref.test.js.map +1 -0
  346. package/dist/workflows/resume.d.ts +5 -11
  347. package/dist/workflows/resume.js +88 -7
  348. package/dist/workflows/resume.js.map +1 -1
  349. package/dist/workflows/runner.d.ts +34 -27
  350. package/dist/workflows/runner.js +252 -930
  351. package/dist/workflows/runner.js.map +1 -1
  352. package/dist/workflows/runner.test.js +346 -35
  353. package/dist/workflows/runner.test.js.map +1 -1
  354. package/dist/workflows/schema.d.ts +52 -10
  355. package/dist/workflows/schema.js +147 -7
  356. package/dist/workflows/schema.js.map +1 -1
  357. package/dist/workflows/simple.d.ts +67 -3
  358. package/dist/workflows/simple.js +248 -87
  359. package/dist/workflows/simple.js.map +1 -1
  360. package/dist/workflows/simple.test.d.ts +1 -0
  361. package/dist/workflows/simple.test.js +107 -0
  362. package/dist/workflows/simple.test.js.map +1 -0
  363. package/dist/workflows/templates.d.ts +29 -0
  364. package/dist/workflows/templates.js +42 -4
  365. package/dist/workflows/templates.js.map +1 -1
  366. package/dist/workflows/templates.test.js +103 -0
  367. package/dist/workflows/templates.test.js.map +1 -1
  368. package/dist/workflows/triggers.d.ts +21 -0
  369. package/dist/workflows/triggers.js +44 -0
  370. package/dist/workflows/triggers.js.map +1 -0
  371. package/dist/workflows/verdict.d.ts +19 -0
  372. package/dist/workflows/verdict.js +30 -0
  373. package/dist/workflows/verdict.js.map +1 -0
  374. package/dist/workflows/verdict.test.d.ts +1 -0
  375. package/dist/workflows/verdict.test.js +44 -0
  376. package/dist/workflows/verdict.test.js.map +1 -0
  377. package/dist/worktree/manager.d.ts +1 -1
  378. package/dist/worktree/manager.js +14 -14
  379. package/dist/worktree/manager.js.map +1 -1
  380. package/dist/worktree/manager.test.d.ts +1 -0
  381. package/dist/worktree/manager.test.js +87 -0
  382. package/dist/worktree/manager.test.js.map +1 -0
  383. package/docker-compose.yml +206 -5
  384. package/package.json +17 -7
  385. package/sandbox.Dockerfile +97 -18
  386. package/skills/README.md +40 -0
  387. package/skills/browser-qa/SKILL.md +193 -0
  388. package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
  389. package/skills/building/SKILL.md +95 -0
  390. package/skills/chat/SKILL.md +30 -11
  391. package/skills/code-review/SKILL.md +59 -0
  392. package/skills/debug-production/SKILL.md +108 -0
  393. package/skills/demo/SKILL.md +194 -0
  394. package/skills/demo/scripts/compose-demo.sh +205 -0
  395. package/skills/issue-answer/SKILL.md +90 -0
  396. package/skills/issue-comment/SKILL.md +38 -24
  397. package/skills/issue-triage/SKILL.md +103 -37
  398. package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
  399. package/skills/pr-comment/SKILL.md +64 -0
  400. package/skills/pr-review/SKILL.md +65 -49
  401. package/skills/qa-test/SKILL.md +97 -0
  402. package/skills/repo-health/SKILL.md +48 -45
  403. package/skills/security-feedback/SKILL.md +173 -0
  404. package/skills/security-feedback/references/templates.md +77 -0
  405. package/skills/security-review/SKILL.md +213 -0
  406. package/skills/security-review/references/issue-format.md +302 -0
  407. package/skills/verify/SKILL.md +118 -0
  408. package/workflows/answer.yaml +37 -0
  409. package/workflows/build.yaml +32 -22
  410. package/workflows/cron-security.yaml +6 -0
  411. package/workflows/demo.yaml +55 -0
  412. package/workflows/explore.yaml +9 -0
  413. package/workflows/pr-comment.yaml +16 -0
  414. package/workflows/pr-fix.yaml +3 -0
  415. package/workflows/pr-review.yaml +4 -1
  416. package/workflows/prompts/answer.md +67 -0
  417. package/workflows/prompts/architect.md +24 -7
  418. package/workflows/prompts/demo.md +100 -0
  419. package/workflows/prompts/executor.md +29 -20
  420. package/workflows/prompts/explore-ask.md +51 -22
  421. package/workflows/prompts/explore-publish.md +2 -2
  422. package/workflows/prompts/explore-read.md +24 -10
  423. package/workflows/prompts/explore-synthesize.md +15 -8
  424. package/workflows/prompts/fix.md +9 -10
  425. package/workflows/prompts/guardrails.md +26 -8
  426. package/workflows/prompts/pr-fix.md +6 -7
  427. package/workflows/prompts/pr.md +11 -10
  428. package/workflows/prompts/qa-browser.md +95 -0
  429. package/workflows/prompts/qa-synth.md +44 -0
  430. package/workflows/prompts/qa-test.md +60 -0
  431. package/workflows/prompts/re-reviewer.md +8 -9
  432. package/workflows/prompts/reviewer.md +10 -9
  433. package/workflows/prompts/verify-browser.md +93 -0
  434. package/workflows/prompts/verify-synth.md +44 -0
  435. package/workflows/prompts/verify.md +63 -0
  436. package/workflows/qa-test.yaml +87 -0
  437. package/workflows/security-feedback.yaml +25 -0
  438. package/workflows/security-review.yaml +29 -0
  439. package/workflows/verify.yaml +85 -0
  440. package/deploy/mcp-config.tmpl.json +0 -14
  441. package/dist/cron/rate-limits.d.ts +0 -26
  442. package/dist/cron/rate-limits.js +0 -193
  443. package/dist/cron/rate-limits.js.map +0 -1
  444. package/dist/engine/executor.d.ts +0 -75
  445. package/dist/engine/executor.js +0 -292
  446. package/dist/engine/executor.js.map +0 -1
  447. package/mcp-github-app/package.json +0 -18
  448. package/mcp-github-app/src/auth.js +0 -66
  449. package/mcp-github-app/src/github.js +0 -371
  450. package/mcp-github-app/src/index.js +0 -534
  451. package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
  452. package/skills/github/DESCRIPTION.md +0 -3
  453. package/skills/github/codebase-inspection/SKILL.md +0 -115
  454. package/skills/github/github-auth/SKILL.md +0 -54
  455. package/skills/github/github-auth/scripts/gh-env.sh +0 -66
  456. package/skills/github/github-code-review/SKILL.md +0 -480
  457. package/skills/github/github-code-review/references/review-output-template.md +0 -74
  458. package/skills/github/github-issues/SKILL.md +0 -369
  459. package/skills/github/github-issues/templates/bug-report.md +0 -35
  460. package/skills/github/github-issues/templates/feature-request.md +0 -31
  461. package/skills/github/github-pr-workflow/SKILL.md +0 -395
  462. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
  463. package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
  464. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
  465. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
  466. package/skills/github/github-repo-management/SKILL.md +0 -515
  467. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
  468. package/skills/github-orchestrator/SKILL.md +0 -103
  469. package/skills/mcp/DESCRIPTION.md +0 -3
  470. package/skills/mcp/mcporter/SKILL.md +0 -122
  471. package/skills/mcp/native-mcp/SKILL.md +0 -356
  472. package/skills/software-development/architect/SKILL.md +0 -154
  473. package/skills/software-development/assure-guardrails/SKILL.md +0 -239
  474. package/skills/software-development/plan/SKILL.md +0 -64
  475. package/skills/software-development/requesting-code-review/SKILL.md +0 -291
  476. package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
  477. package/skills/software-development/systematic-debugging/SKILL.md +0 -366
  478. package/skills/software-development/test-driven-development/SKILL.md +0 -342
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Shared, platform-agnostic notification model.
3
+ *
4
+ * The notifier renders workflow progress as a single "task list" surface that
5
+ * is **edited in place** as phases run — one GitHub comment (via
6
+ * `issues.updateComment`) and/or one Slack message (via `chat.update`) instead
7
+ * of a fresh comment per phase. The model here is the canonical content; the
8
+ * renderer (`render.ts`) turns it into markdown that both platforms consume
9
+ * (Slack runs the markdown through `markdownToSlackMrkdwn` in its transport).
10
+ *
11
+ * Nothing in this module imports GitHub or Slack — platform code lives behind
12
+ * the `NotifierTransport` interface so the content model stays decoupled and
13
+ * shared.
14
+ */
15
+ /** Lifecycle state of a single checklist step. */
16
+ export type StepStatus = "pending" | "running" | "done" | "blocked" | "awaiting" | "failed" | "skipped";
17
+ /** One row in the task list. `key` is stable; `label` is what humans see. */
18
+ export interface ProgressStep {
19
+ key: string;
20
+ label: string;
21
+ status: StepStatus;
22
+ /** Optional one-line context shown after the label (e.g. a link or status). */
23
+ detail?: string;
24
+ }
25
+ /** The full content model rendered into the single status surface. */
26
+ export interface ProgressModel {
27
+ /** Heading line, e.g. "build for #18". */
28
+ title: string;
29
+ /** Optional bold sub-heading, e.g. the issue title. */
30
+ subtitle?: string;
31
+ /** Optional metadata lines under the heading (branch link, PR link, …). */
32
+ meta?: string[];
33
+ /** Ordered checklist. */
34
+ steps: ProgressStep[];
35
+ /** Optional trailing line (e.g. artifacts link). */
36
+ footer?: string;
37
+ }
38
+ /**
39
+ * A platform binding. Each transport owns its own in-place-update handle
40
+ * (a GitHub comment id or a Slack message ts) internally.
41
+ */
42
+ export interface NotifierTransport {
43
+ /** Create-or-update the single status surface with the rendered markdown. */
44
+ publish(markdown: string): Promise<void>;
45
+ /**
46
+ * Post a *new, separate* message (not an edit). Used for approval prompts —
47
+ * moments worth an actual notification, since an in-place edit is silent.
48
+ */
49
+ note(markdown: string): Promise<void>;
50
+ /**
51
+ * Whether this surface wants a separate *completion* ping at the end of a
52
+ * run. Slack sets this (its in-place edits are silent and it has no other
53
+ * signal); GitHub leaves it false — the edited checklist plus the
54
+ * PR-opened event already notify watchers, so a terminal comment would just
55
+ * be noise. Default false.
56
+ */
57
+ readonly terminalPing?: boolean;
58
+ }
59
+ /**
60
+ * The runner-facing API. `runner.ts` only ever sees this interface — it never
61
+ * touches a transport or the markdown directly.
62
+ */
63
+ export interface ProgressReporter {
64
+ /** Seed the task list. Idempotent: a resumed run re-seeds the same surface. */
65
+ start(model: ProgressModel): Promise<void>;
66
+ /** Transition a step's status (and optionally set its one-line detail). */
67
+ step(key: string, status: StepStatus, detail?: string): Promise<void>;
68
+ /**
69
+ * Insert (or update) a dynamic step before `beforeKey` — used for loop
70
+ * iterations (re-review / fix cycles). Appends when `beforeKey` is omitted
71
+ * or not found.
72
+ */
73
+ insertStep(step: ProgressStep, beforeKey?: string): Promise<void>;
74
+ /** Post a standalone message to every surface (e.g. an approval prompt). */
75
+ note(markdown: string): Promise<void>;
76
+ /**
77
+ * Set (or clear) the trailing footer of the single status surface and
78
+ * re-publish in place. Used to fold a workflow's final synthesized result
79
+ * into the same comment as the checklist rather than posting a new one.
80
+ * Pass an empty string to clear.
81
+ */
82
+ footer(markdown: string): Promise<void>;
83
+ /**
84
+ * Post the run's completion message, but only to surfaces that want a
85
+ * terminal ping (Slack) — GitHub is left with just the finished checklist.
86
+ */
87
+ noteTerminal(markdown: string): Promise<void>;
88
+ }
89
+ /** Persisted in-place-update handles, stored under `workflow_runs.scratch.notifier`. */
90
+ export interface NotifierState {
91
+ githubCommentId?: number;
92
+ slackTs?: string;
93
+ slackChannel?: string;
94
+ slackThread?: string;
95
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared, platform-agnostic notification model.
3
+ *
4
+ * The notifier renders workflow progress as a single "task list" surface that
5
+ * is **edited in place** as phases run — one GitHub comment (via
6
+ * `issues.updateComment`) and/or one Slack message (via `chat.update`) instead
7
+ * of a fresh comment per phase. The model here is the canonical content; the
8
+ * renderer (`render.ts`) turns it into markdown that both platforms consume
9
+ * (Slack runs the markdown through `markdownToSlackMrkdwn` in its transport).
10
+ *
11
+ * Nothing in this module imports GitHub or Slack — platform code lives behind
12
+ * the `NotifierTransport` interface so the content model stays decoupled and
13
+ * shared.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/notify/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,128 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { readFileSync } from "fs";
3
+ import { resolve } from "path";
4
+ import { parse } from "yaml";
5
+ import { COREDNS_OPEN_IP, COREDNS_STRICT_IP, NGINX_OPEN_IP, NGINX_STRICT_IP, OTEL_COLLECTOR_IP, OTEL_COLLECTOR_UID, SANDBOX_EGRESS_SUBNET, } from "./egress-firewall-config.js";
6
+ const compose = parse(readFileSync(resolve(__dirname, "../../docker-compose.yml"), "utf-8"));
7
+ const FIREWALL_SERVICES = [
8
+ "nginx-egress-strict",
9
+ "nginx-egress-open",
10
+ "coredns-strict",
11
+ "coredns-open",
12
+ ];
13
+ const HARNESS_SERVICES = ["agent", "caddy"];
14
+ function networkNamesOf(service) {
15
+ const nets = compose.services[service]?.networks;
16
+ if (!nets)
17
+ return [];
18
+ if (Array.isArray(nets))
19
+ return nets;
20
+ return Object.keys(nets);
21
+ }
22
+ function ipv4OnNetwork(service, net) {
23
+ const nets = compose.services[service]?.networks;
24
+ if (!nets || Array.isArray(nets))
25
+ return undefined;
26
+ const cfg = nets[net];
27
+ if (cfg && typeof cfg === "object" && "ipv4_address" in cfg) {
28
+ return String(cfg.ipv4_address);
29
+ }
30
+ return undefined;
31
+ }
32
+ describe("docker-compose egress topology", () => {
33
+ it("declares the three expected networks", () => {
34
+ expect(Object.keys(compose.networks).sort()).toEqual(["internal", "proxy-egress", "sandbox-egress"].sort());
35
+ });
36
+ it("marks sandbox-egress as internal: true with the expected static subnet", () => {
37
+ const net = compose.networks["sandbox-egress"];
38
+ expect(net?.internal).toBe(true);
39
+ // Subnet must match SANDBOX_EGRESS_SUBNET so the constants in
40
+ // egress-firewall-config.ts are valid IPs in that range.
41
+ const subnet = net?.ipam?.config?.[0]?.subnet;
42
+ expect(subnet).toBe(SANDBOX_EGRESS_SUBNET);
43
+ });
44
+ it("proxy-egress is a regular bridge (no internal: true) so firewalls can reach the internet", () => {
45
+ const net = compose.networks["proxy-egress"];
46
+ // YAML `proxy-egress:` parses to null when no fields are set.
47
+ expect(net == null || net.internal !== true).toBe(true);
48
+ });
49
+ for (const svc of FIREWALL_SERVICES) {
50
+ describe(svc, () => {
51
+ const nets = networkNamesOf(svc);
52
+ it("does NOT attach to the harness `internal` network", () => {
53
+ // Security-critical: if regressed, an unrestricted sandbox can
54
+ // bridge into compose-internal services via the firewall.
55
+ expect(nets).not.toContain("internal");
56
+ });
57
+ it("attaches to sandbox-egress (so sandboxes can reach it)", () => {
58
+ expect(nets).toContain("sandbox-egress");
59
+ });
60
+ });
61
+ }
62
+ it("nginx firewalls attach to proxy-egress (so they can reach the public internet)", () => {
63
+ for (const svc of ["nginx-egress-strict", "nginx-egress-open"]) {
64
+ expect(networkNamesOf(svc)).toContain("proxy-egress");
65
+ }
66
+ });
67
+ describe("otel-collector", () => {
68
+ const nets = networkNamesOf("otel-collector");
69
+ it("is dual-homed on sandbox-egress (ingress from sandboxes) + proxy-egress (outbound to backend)", () => {
70
+ expect(nets).toContain("sandbox-egress");
71
+ expect(nets).toContain("proxy-egress");
72
+ });
73
+ it("does NOT attach to the harness `internal` network (can't bridge a sandbox into harness services)", () => {
74
+ expect(nets).not.toContain("internal");
75
+ });
76
+ it("uses the static IP the harness bakes into the sandbox OTLP endpoint", () => {
77
+ expect(ipv4OnNetwork("otel-collector", "sandbox-egress")).toBe(OTEL_COLLECTOR_IP);
78
+ });
79
+ it("does NOT force root — runs as the image's non-root UID", () => {
80
+ // The harness writes the mode-0600 config as UID OTEL_COLLECTOR_UID (its
81
+ // `lastlight` user is pinned to it), so the collector reads it as owner
82
+ // without root. If this ever regresses to `user: "0:0"`, we'd be running
83
+ // a sandbox-facing service as root unnecessarily.
84
+ expect(compose.services["otel-collector"]?.user).toBeUndefined();
85
+ });
86
+ });
87
+ it("pins the harness `lastlight` UID to the collector image UID so it can read the 0600 config", () => {
88
+ // The collector reads the harness-written mode-0600 OTLP config as its
89
+ // owner. That only works if the harness writes it as the collector's UID,
90
+ // so the Dockerfile must `useradd -u <OTEL_COLLECTOR_UID> lastlight`. If
91
+ // the collector image's UID ever changes, this test fails loudly to force
92
+ // bumping both together.
93
+ const dockerfile = readFileSync(resolve(__dirname, "../../Dockerfile"), "utf-8");
94
+ expect(dockerfile).toMatch(new RegExp(`useradd[^\\n]*-u\\s+${OTEL_COLLECTOR_UID}\\s+lastlight`));
95
+ });
96
+ it("coredns containers do NOT attach to proxy-egress (no internet needed)", () => {
97
+ // CoreDNS only synthesises answers from its config; it never recurses.
98
+ // Keeping it off proxy-egress is defence in depth.
99
+ for (const svc of ["coredns-strict", "coredns-open"]) {
100
+ expect(networkNamesOf(svc)).not.toContain("proxy-egress");
101
+ }
102
+ });
103
+ it("static IPs match the constants the harness bakes into the generated configs", () => {
104
+ expect(ipv4OnNetwork("coredns-strict", "sandbox-egress")).toBe(COREDNS_STRICT_IP);
105
+ expect(ipv4OnNetwork("coredns-open", "sandbox-egress")).toBe(COREDNS_OPEN_IP);
106
+ expect(ipv4OnNetwork("nginx-egress-strict", "sandbox-egress")).toBe(NGINX_STRICT_IP);
107
+ expect(ipv4OnNetwork("nginx-egress-open", "sandbox-egress")).toBe(NGINX_OPEN_IP);
108
+ });
109
+ for (const svc of HARNESS_SERVICES) {
110
+ it(`harness service \`${svc}\` does NOT attach to proxy-egress or sandbox-egress`, () => {
111
+ // Keeps the egress fabric isolated from anything carrying secrets.
112
+ const nets = networkNamesOf(svc);
113
+ expect(nets).not.toContain("proxy-egress");
114
+ expect(nets).not.toContain("sandbox-egress");
115
+ });
116
+ }
117
+ it("proxy-egress contains exactly the two nginx firewalls and the otel-collector", () => {
118
+ // These are the only services allowed an outbound path: the firewalls
119
+ // tunnel sandbox HTTPS, and the collector re-exports sandbox telemetry.
120
+ // None touch `internal`, so none can bridge a sandbox into harness
121
+ // services. Any other service appearing here is a regression.
122
+ const onProxyEgress = Object.keys(compose.services)
123
+ .filter((name) => networkNamesOf(name).includes("proxy-egress"))
124
+ .sort();
125
+ expect(onProxyEgress).toEqual(["nginx-egress-open", "nginx-egress-strict", "otel-collector"]);
126
+ });
127
+ });
128
+ //# sourceMappingURL=docker-compose.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-compose.test.js","sourceRoot":"","sources":["../../src/sandbox/docker-compose.test.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * workspace after volumes are mounted — no post-run docker exec needed.
7
7
  *
8
8
  * Volumes mounted at runtime:
9
- * - Shared data volume (/data): Claude auth, secrets (app.pem), session logs
9
+ * - Shared data volume (/data): secrets (app.pem), session logs
10
10
  * - Task worktree (/home/agent/workspace): per-task git repo
11
11
  */
12
12
  export interface SandboxConfig {
@@ -16,12 +16,61 @@ export interface SandboxConfig {
16
16
  env: Record<string, string>;
17
17
  /** Timeout in seconds (default: 1800 = 30 min) */
18
18
  timeoutSeconds?: number;
19
+ /**
20
+ * Per-sandbox memory cap, in Docker's `--memory` format (e.g. "2g", "512m").
21
+ * Default: 2g — enough headroom for `npm install`, vite build, and an
22
+ * agent loop, but small enough that several concurrent sandboxes can't
23
+ * exhaust a 16 GB host. Override via the `SANDBOX_MEMORY_LIMIT` env var.
24
+ */
25
+ memoryLimit?: string;
26
+ /**
27
+ * Docker network to attach the sandbox container to. Defaults to
28
+ * `LASTLIGHT_SANDBOX_NETWORK` env var or `lastlight_sandbox-egress`
29
+ * (the `internal: true` network declared in docker-compose.yml). The
30
+ * sandbox can only reach the public internet through the nginx-egress
31
+ * firewall sidecars on this network.
32
+ */
33
+ network?: string;
34
+ /**
35
+ * IP of the coredns sidecar this sandbox uses as its DNS resolver.
36
+ * `coredns-strict` (172.30.0.10) returns the strict-nginx IP for
37
+ * allowlisted hosts and NXDOMAIN for everything else; `coredns-open`
38
+ * (172.30.0.11) returns the open-nginx IP for any hostname (minus a
39
+ * small SSRF deny set). Passed to `docker run` as `--dns <ip>`.
40
+ *
41
+ * No env vars are injected — the sandbox has no idea a firewall is
42
+ * in front of it. Works for every SDK regardless of whether it
43
+ * honours HTTP_PROXY / HTTPS_PROXY.
44
+ */
45
+ dnsIp?: string;
19
46
  }
20
47
  export interface SandboxInfo {
21
48
  containerId: string;
22
49
  containerName: string;
23
50
  worktreePath: string;
24
51
  }
52
+ /**
53
+ * How `/home/agent/workspace` is materialized inside the sandbox container.
54
+ *
55
+ * - `bind`: classic host-path bind mount. Only safe when the host filesystem
56
+ * path is identical from the harness's view and the docker daemon's view —
57
+ * i.e. local dev where the harness runs directly on the host, or any
58
+ * deployment where `SANDBOX_DATA_VOLUME` is a real host path.
59
+ * - `volume-subpath`: mount a subpath of a named docker volume. Required
60
+ * when the harness runs inside a container that holds the data dir via a
61
+ * named volume (the standard docker-compose setup). A bare bind would
62
+ * resolve `/app/data/sandboxes/<id>` against the host's empty bare-FS
63
+ * `/app/data/...` rather than the named volume's `_data/sandboxes/<id>`,
64
+ * producing two divergent trees and breaking skill staging.
65
+ */
66
+ export type WorkspaceMount = {
67
+ type: "bind";
68
+ hostPath: string;
69
+ } | {
70
+ type: "volume-subpath";
71
+ volume: string;
72
+ subpath: string;
73
+ };
25
74
  export declare class DockerSandbox {
26
75
  private config;
27
76
  private activeContainers;
@@ -32,25 +81,64 @@ export declare class DockerSandbox {
32
81
  create(opts: {
33
82
  taskId: string;
34
83
  worktreePath: string;
84
+ workspaceMount: WorkspaceMount;
35
85
  }): Promise<SandboxInfo>;
36
86
  /**
37
- * Wait for the sandbox entrypoint to finish setup.
38
- * Polls for the credentials symlink in the agent's home directory.
87
+ * Wait for the sandbox entrypoint to finish setup. The entrypoint touches
88
+ * `$WORKSPACE/.ready` as its last step before exec'ing the agent shell.
39
89
  */
40
90
  private waitForReady;
41
91
  /**
42
- * Run the Claude CLI inside the sandbox with a prompt.
92
+ * Run the agentic-pi CLI inside the sandbox with a prompt.
43
93
  *
44
- * Streams stdout line-by-line so the caller can react to stream-json events
45
- * (e.g. capture the session id from the `system/init` line) before the
46
- * agent has finished. The full stdout is also buffered and returned for
47
- * post-run parsing of the `result` line.
94
+ * Streams stdout line-by-line so the caller can react to JSON events
95
+ * (e.g. capture the top-level `session` record's id) before the agent
96
+ * has finished. The full stdout is also buffered and returned for
97
+ * post-run parsing of the usage_snapshot rollup.
48
98
  */
49
99
  runAgent(taskId: string, prompt: string, opts?: {
50
100
  model?: string;
101
+ /**
102
+ * Pi thinking level: `off | minimal | low | medium | high | xhigh`.
103
+ * Validated against the closed set before being shell-interpolated.
104
+ */
105
+ thinking?: string;
106
+ /** agentic-pi GitHub profile: `read | issues-write | review-write | repo-write`. */
107
+ profile?: string;
108
+ /**
109
+ * Env forwarded INTO the sandboxed run via repeated `--sandbox-env`
110
+ * flags. Used to inject git identity. Keys / values are charset-asserted
111
+ * before shell interpolation.
112
+ */
113
+ sandboxEnv?: Record<string, string>;
114
+ /**
115
+ * Working directory for the agent process inside the container.
116
+ * Defaults to WORKSPACE_DIR (the workspace root). When the harness
117
+ * pre-cloned the target repo, the executor passes
118
+ * `<WORKSPACE_DIR>/<repo>` so the agent starts inside the checked-out
119
+ * tree. The path is asserted against an allowlist before being passed
120
+ * to `docker exec -w` to keep it shell-safe.
121
+ */
122
+ agentCwd?: string;
123
+ /**
124
+ * Enable agentic-pi's web-search extension. When false (or omitted),
125
+ * `--no-web-search` is appended to suppress auto-enable. When true,
126
+ * the flag is omitted and agentic-pi auto-detects the provider from
127
+ * whichever `*_API_KEY` env var the container received.
128
+ */
129
+ webSearch?: boolean;
130
+ /** Force a specific web-search provider. Validated against a closed set. */
131
+ webSearchProvider?: "tavily" | "brave" | "exa";
132
+ /**
133
+ * Per-phase skill directories to load, as absolute in-container paths
134
+ * under WORKSPACE_DIR (e.g. `/home/agent/workspace/.lastlight-skills/
135
+ * <phase>/<skill>`). Each becomes a repeated `--skill <dir>` flag.
136
+ * Charset/prefix-asserted before shell interpolation.
137
+ */
138
+ skillDirs?: string[];
51
139
  /** Called for each newline-terminated stdout line as it arrives. */
52
140
  onLine?: (line: string) => void;
53
- }): Promise<string>;
141
+ }): Promise<void>;
54
142
  /**
55
143
  * Remove a sandbox container.
56
144
  */