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
@@ -5,6 +5,8 @@ import { dirname, isAbsolute, join, relative, resolve } from "path";
5
5
  import { randomUUID } from "crypto";
6
6
  const execFileAsync = promisify(execFileCb);
7
7
  const WORKSPACE_DIR = "/home/agent/workspace";
8
+ /** Shared package-manager download cache mount (issue #107). */
9
+ const PKG_CACHE_DIR = "/cache";
8
10
  export class DockerSandbox {
9
11
  config;
10
12
  activeContainers = new Map();
@@ -17,9 +19,9 @@ export class DockerSandbox {
17
19
  async create(opts) {
18
20
  const containerName = `lastlight-sandbox-${opts.taskId}-${randomUUID().slice(0, 8)}`;
19
21
  const worktreePath = resolve(opts.worktreePath);
20
- // Shared data — mounted at /data inside the sandbox. Contains claude auth,
21
- // session logs, etc. (see deploy/sandbox-entrypoint.sh for the layout it
22
- // expects).
22
+ // Shared data — mounted at /data inside the sandbox. Contains secrets
23
+ // (app.pem) and the opencode-home session-jsonl tree (see
24
+ // deploy/sandbox-entrypoint.sh for the layout it expects).
23
25
  //
24
26
  // SANDBOX_DATA_VOLUME accepts either:
25
27
  // - a Docker named volume name (e.g. "lastlight_agent-data") — used in
@@ -33,28 +35,99 @@ export class DockerSandbox {
33
35
  const dataMount = isPathLike(dataVolumeRaw)
34
36
  ? resolveHostPath(dataVolumeRaw) // bind mount → absolute host path
35
37
  : dataVolumeRaw; // named volume → pass through
36
- const volumes = [
37
- `${dataMount}:/data`, // shared state (claude-home, sessions)
38
- `${worktreePath}:${WORKSPACE_DIR}`, // task worktree
39
- ];
40
- // Resolve git mounts for worktrees (if .git is a file pointing elsewhere)
41
- const gitMounts = this.resolveGitMounts(worktreePath);
42
- volumes.push(...gitMounts);
43
- // Env flags passed to entrypoint for MCP config template expansion
38
+ // /data is the same volume the workspace is carved out of (or the same
39
+ // host path), so the same -v form covers both — bind for path mode,
40
+ // named volume for volume mode. The workspace itself needs the more
41
+ // precise `--mount … volume-subpath=…` form in volume mode so the
42
+ // sandbox sees the harness's sandboxes/<taskId>/ dir rather than an
43
+ // empty docker-auto-created bind target on the host filesystem (the
44
+ // bug that made staged skills invisible — the two paths look identical
45
+ // but live in different physical locations).
46
+ const dockerArgs = ["-v", `${dataMount}:/data`];
47
+ if (opts.workspaceMount.type === "bind") {
48
+ dockerArgs.push("-v", `${opts.workspaceMount.hostPath}:${WORKSPACE_DIR}`);
49
+ }
50
+ else {
51
+ const { volume, subpath } = opts.workspaceMount;
52
+ dockerArgs.push("--mount", `type=volume,source=${volume},target=${WORKSPACE_DIR},volume-subpath=${subpath}`);
53
+ }
54
+ // Shared package-manager cache, mounted at /cache and shared across every
55
+ // sandbox (issue #107). Each ecosystem's download cache is content-
56
+ // addressed, so sharing across repos is safe and avoids re-fetching the
57
+ // same tarballs on every run. We point npm / pnpm / yarn at subdirs of it
58
+ // via env below; the entrypoint chowns them to the agent user. This is the
59
+ // *download* cache only — per-workspace `node_modules` stays per-workspace
60
+ // (a shared store can't hardlink across separate container mounts anyway).
61
+ //
62
+ // A Docker named volume (auto-created on first use); override the name with
63
+ // LASTLIGHT_PKG_CACHE_VOLUME. In local path-mode this is still a named
64
+ // volume — it needs no host-path view, so the volume/bind split that the
65
+ // workspace mount needs doesn't apply here.
66
+ const pkgCacheVolume = process.env.LASTLIGHT_PKG_CACHE_VOLUME || "lastlight_pkg-cache";
67
+ dockerArgs.push("-v", `${pkgCacheVolume}:${PKG_CACHE_DIR}`);
68
+ // Point each package manager at its shared subdir. npm reads npm_config_cache;
69
+ // pnpm reads npm-style env config (npm_config_store_dir → store-dir); yarn
70
+ // (classic + berry) reads YARN_CACHE_FOLDER. The agent already picks the PM
71
+ // from the repo's lockfile (see skills/pr-review/SKILL.md), so all three are
72
+ // wired regardless of which one a given repo uses.
73
+ dockerArgs.push("-e", `npm_config_cache=${PKG_CACHE_DIR}/npm`, "-e", `npm_config_store_dir=${PKG_CACHE_DIR}/pnpm`, "-e", `YARN_CACHE_FOLDER=${PKG_CACHE_DIR}/yarn`);
74
+ // Resolve git mounts for worktrees (if .git is a file pointing elsewhere).
75
+ // In volume-subpath mode these are still emitted as bind mounts; the
76
+ // gitMounts path is only hit for git worktrees that live alongside the
77
+ // sandbox in the same data dir, so for the named-volume case the
78
+ // sources would also be invisible from the daemon's view. The codebase
79
+ // doesn't currently exercise that combination — pre-clones always
80
+ // produce a real .git directory inside worktreePath — so leaving the
81
+ // bind form here keeps the existing path mode working without adding
82
+ // dead complexity to the named-volume path. If we ever wire a real
83
+ // git worktree under volume mode this needs the same translation.
84
+ const gitMounts = this.resolveGitMounts(worktreePath).flatMap((m) => ["-v", m]);
85
+ dockerArgs.push(...gitMounts);
86
+ // Env flags — passed to entrypoint for MCP config template expansion.
87
+ // No proxy env (HTTPS_PROXY etc.) is injected: the sandbox-egress
88
+ // network has no route to the public internet, and the coredns
89
+ // sidecar referenced by --dns below sinkholes allowlisted hosts to
90
+ // the nginx-egress firewall IP. Clients dial real hostnames; the
91
+ // network routes them transparently. See egress-firewall-config.ts.
44
92
  const envFlags = Object.entries(this.config.env).flatMap(([k, v]) => ["-e", `${k}=${v}`]);
93
+ // Per-sandbox memory cap. Without this, a runaway agent (or a hot
94
+ // `npm install` / vite build inside the workspace) can OOM the host
95
+ // and take every other container with it. We set --memory-swap to the
96
+ // same value so swap can't be used to silently exceed the cap.
97
+ const memoryLimit = this.config.memoryLimit || "2g";
98
+ // Network attachment. Default is the `internal: true` sandbox-egress
99
+ // network declared in docker-compose.yml, which has no host route —
100
+ // the only outbound path is through nginx-egress, reached via the
101
+ // DNS sinkhole. Override via LASTLIGHT_SANDBOX_NETWORK for setups
102
+ // (local dev, alt orchestration) where the harness was started
103
+ // outside docker-compose and the network hasn't been created.
104
+ const network = this.config.network ||
105
+ process.env.LASTLIGHT_SANDBOX_NETWORK ||
106
+ "lastlight_sandbox-egress";
107
+ const networkArgs = network === "default" ? [] : ["--network", network];
108
+ // DNS resolver. Points at coredns-strict or coredns-open depending on
109
+ // the phase's egress policy. The whole filtering scheme hinges on
110
+ // this — every name lookup happens against our sinkhole, and
111
+ // allowlisted hosts get answered with the nginx-egress IP rather
112
+ // than the real one.
113
+ const dnsArgs = this.config.dnsIp ? ["--dns", this.config.dnsIp] : [];
45
114
  // The entrypoint runs as root to fix permissions, then drops to agent via gosu.
46
115
  // No --user flag needed.
47
116
  const args = [
48
117
  "run", "-d",
49
118
  "--name", containerName,
119
+ "--memory", memoryLimit,
120
+ "--memory-swap", memoryLimit,
121
+ ...networkArgs,
122
+ ...dnsArgs,
50
123
  ...envFlags,
51
- ...volumes.flatMap(v => ["-v", v]),
124
+ ...dockerArgs,
52
125
  "-w", WORKSPACE_DIR,
53
126
  this.config.imageName,
54
127
  ];
55
128
  try {
56
- // The entrypoint handles all setup: claude auth, skills, CLAUDE.md,
57
- // .mcp.json, and git config. No docker exec calls needed.
129
+ // The entrypoint handles all setup: AGENTS.md, opencode.json, app.pem
130
+ // materialization, and git config. No docker exec calls needed.
58
131
  const containerId = execCmd("docker", args).trim();
59
132
  const info = { containerId, containerName, worktreePath };
60
133
  this.activeContainers.set(opts.taskId, info);
@@ -70,57 +143,131 @@ export class DockerSandbox {
70
143
  }
71
144
  }
72
145
  /**
73
- * Wait for the sandbox entrypoint to finish setup.
74
- * Polls for the credentials symlink in the agent's home directory.
146
+ * Wait for the sandbox entrypoint to finish setup. The entrypoint touches
147
+ * `$WORKSPACE/.ready` as its last step before exec'ing the agent shell.
75
148
  */
76
149
  async waitForReady(containerName, timeoutMs = 15000) {
77
150
  const start = Date.now();
78
151
  const interval = 500;
79
152
  while (Date.now() - start < timeoutMs) {
80
153
  try {
81
- const { stdout } = await execFileAsync("docker", [
154
+ await execFileAsync("docker", [
82
155
  "exec", "--user", "agent", containerName,
83
- "test", "-f", "/home/agent/.claude/.credentials.json",
156
+ "test", "-f", `${WORKSPACE_DIR}/.ready`,
84
157
  ], { timeout: 5000 });
85
- // File exists — entrypoint is done
86
158
  return;
87
159
  }
88
160
  catch {
89
- // Not ready yet — wait and retry
90
161
  await new Promise((r) => setTimeout(r, interval));
91
162
  }
92
163
  }
93
164
  console.warn(`[sandbox] Timed out waiting for ${containerName} to be ready — proceeding anyway`);
94
165
  }
95
166
  /**
96
- * Run the Claude CLI inside the sandbox with a prompt.
167
+ * Run the agentic-pi CLI inside the sandbox with a prompt.
97
168
  *
98
- * Streams stdout line-by-line so the caller can react to stream-json events
99
- * (e.g. capture the session id from the `system/init` line) before the
100
- * agent has finished. The full stdout is also buffered and returned for
101
- * post-run parsing of the `result` line.
169
+ * Streams stdout line-by-line so the caller can react to JSON events
170
+ * (e.g. capture the top-level `session` record's id) before the agent
171
+ * has finished. The full stdout is also buffered and returned for
172
+ * post-run parsing of the usage_snapshot rollup.
102
173
  */
103
174
  async runAgent(taskId, prompt, opts) {
104
175
  const info = this.activeContainers.get(taskId);
105
176
  if (!info)
106
177
  throw new Error(`No sandbox for task ${taskId}`);
107
- const model = opts?.model || "claude-sonnet-4-6";
178
+ const model = opts?.model || "anthropic/claude-sonnet-4-6";
108
179
  const timeout = this.config.timeoutSeconds || 1800;
109
- const escapedPrompt = prompt.replace(/'/g, "'\\''");
180
+ // `cmd` is interpolated into `sh -c <cmd>` below, so any value we
181
+ // append here is shell-parsed. Assert each opt-supplied flag against
182
+ // a tight allowlist before embedding — defense in depth in case any
183
+ // of these ever gets sourced from user input.
184
+ const THINKING = new Set(["off", "minimal", "low", "medium", "high", "xhigh"]);
185
+ const PROFILES = new Set(["read", "issues-write", "review-write", "repo-write"]);
186
+ const WEB_SEARCH_PROVIDERS = new Set(["tavily", "brave", "exa"]);
187
+ const extraArgs = [];
188
+ if (opts?.thinking) {
189
+ if (!THINKING.has(opts.thinking)) {
190
+ throw new Error(`Refusing to pass thinking "${opts.thinking}" — must be one of ${[...THINKING].join("|")}`);
191
+ }
192
+ extraArgs.push("--thinking", opts.thinking);
193
+ }
194
+ if (opts?.profile) {
195
+ if (!PROFILES.has(opts.profile)) {
196
+ throw new Error(`Refusing to pass profile "${opts.profile}" — must be one of ${[...PROFILES].join("|")}`);
197
+ }
198
+ extraArgs.push("--profile", opts.profile);
199
+ }
200
+ // Web search defaults off — agentic-pi's auto-enable triggers on any
201
+ // provider key env var, so silence it explicitly when the caller didn't
202
+ // opt in. When opted in, omit the flag and let agentic-pi pick up the
203
+ // forwarded TAVILY_API_KEY / BRAVE_SEARCH_API_KEY / EXA_API_KEY.
204
+ if (opts?.webSearch === true) {
205
+ if (opts.webSearchProvider) {
206
+ if (!WEB_SEARCH_PROVIDERS.has(opts.webSearchProvider)) {
207
+ throw new Error(`Refusing to pass web-search-provider "${opts.webSearchProvider}" — must be one of ${[...WEB_SEARCH_PROVIDERS].join("|")}`);
208
+ }
209
+ extraArgs.push("--web-search-provider", opts.webSearchProvider);
210
+ }
211
+ }
212
+ else {
213
+ extraArgs.push("--no-web-search");
214
+ }
215
+ // Per-phase skill bundles. Each must be an in-container path under the
216
+ // workspace root; assert the charset + prefix before it's embedded into
217
+ // the `sh -c` command, mirroring the agentCwd guard below.
218
+ for (const dir of opts?.skillDirs ?? []) {
219
+ if (!dir.startsWith(WORKSPACE_DIR) || !/^[A-Za-z0-9/_.-]+$/.test(dir)) {
220
+ throw new Error(`Refusing to pass skill dir "${dir}" — must live under ${WORKSPACE_DIR}`);
221
+ }
222
+ extraArgs.push("--skill", dir);
223
+ }
224
+ if (!/^[A-Za-z0-9/_.-]+$/.test(model)) {
225
+ throw new Error(`Refusing to pass model "${model}" — bad charset`);
226
+ }
227
+ for (const [k, v] of Object.entries(opts?.sandboxEnv ?? {})) {
228
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(k)) {
229
+ throw new Error(`Refusing sandbox-env key "${k}" — must be UPPER_SNAKE`);
230
+ }
231
+ // Values are shell-quoted below. Reject newlines and the closing
232
+ // quote (single-quote) defensively — both would break the `'…'` wrap.
233
+ if (/[\n\r']/.test(v)) {
234
+ throw new Error(`Refusing sandbox-env value for "${k}" — contains newline or quote`);
235
+ }
236
+ extraArgs.push("--sandbox-env", `${k}='${v}'`);
237
+ }
110
238
  const cmd = [
111
- "claude",
112
- "--print", "--verbose",
113
- "--dangerously-skip-permissions",
114
- "--output-format", "stream-json",
239
+ "agentic-pi", "run",
115
240
  "--model", model,
116
- "-p", `'${escapedPrompt}'`,
241
+ "--sandbox", "none",
242
+ ...extraArgs,
117
243
  ].join(" ");
118
- // Run as agent user Claude Code blocks --dangerously-skip-permissions as root
119
- const args = ["exec", "--user", "agent", "-w", WORKSPACE_DIR, info.containerName, "sh", "-c", cmd];
244
+ // Resolve the agent's cwd. Defaults to the workspace root; callers may
245
+ // pass a `<WORKSPACE_DIR>/<repo>` subdir when the harness pre-cloned the
246
+ // target repo. Asserted against an allowlist before going into
247
+ // `docker exec -w` (which is a separate argv slot, but defensive
248
+ // narrowing keeps surprise paths out).
249
+ const workdir = opts?.agentCwd ?? WORKSPACE_DIR;
250
+ if (!workdir.startsWith(WORKSPACE_DIR) || !/^[A-Za-z0-9/_.-]+$/.test(workdir)) {
251
+ throw new Error(`Refusing to pass agent cwd "${workdir}" — must live under ${WORKSPACE_DIR}`);
252
+ }
253
+ // -i connects stdin so the prompt can be written to the container process.
254
+ // Run as agent user so workspace writes land with the right ownership.
255
+ const args = ["exec", "-i", "--user", "agent", "-w", workdir, info.containerName, "sh", "-c", cmd];
256
+ // The structured event stream is consumed line-by-line via `onLine` and
257
+ // mirrored to the AgenticShim, which writes envelope jsonl to
258
+ // `<sessionsDir>/projects/.../` (read by the admin SessionReader).
259
+ // That is the on-disk log. We deliberately do NOT buffer the full stdout
260
+ // here — for a "read a large repo" run the stream is hundreds of MB and
261
+ // accumulating it in a single string is what OOM'd the harness.
262
+ //
263
+ // We keep only a small bounded tail of stderr so the error-path message
264
+ // is still useful.
265
+ const STDERR_TAIL_BYTES = 8 * 1024;
120
266
  return await new Promise((resolvePromise, reject) => {
121
- const child = spawn("docker", args, { stdio: ["ignore", "pipe", "pipe"] });
122
- let stdout = "";
123
- let stderr = "";
267
+ const child = spawn("docker", args, { stdio: ["pipe", "pipe", "pipe"] });
268
+ child.stdin.write(prompt);
269
+ child.stdin.end();
270
+ let stderrTail = "";
124
271
  let buf = "";
125
272
  const timer = setTimeout(() => {
126
273
  child.kill("SIGKILL");
@@ -128,7 +275,6 @@ export class DockerSandbox {
128
275
  }, timeout * 1000);
129
276
  child.stdout.setEncoding("utf-8");
130
277
  child.stdout.on("data", (chunk) => {
131
- stdout += chunk;
132
278
  if (!opts?.onLine)
133
279
  return;
134
280
  // Emit complete lines to the caller as they arrive — keeps a partial
@@ -147,7 +293,12 @@ export class DockerSandbox {
147
293
  }
148
294
  });
149
295
  child.stderr.setEncoding("utf-8");
150
- child.stderr.on("data", (chunk) => { stderr += chunk; });
296
+ child.stderr.on("data", (chunk) => {
297
+ stderrTail += chunk;
298
+ if (stderrTail.length > STDERR_TAIL_BYTES) {
299
+ stderrTail = stderrTail.slice(-STDERR_TAIL_BYTES);
300
+ }
301
+ });
151
302
  child.on("error", (err) => {
152
303
  clearTimeout(timer);
153
304
  reject(new Error(`Sandbox agent spawn failed: ${err.message}`));
@@ -163,10 +314,10 @@ export class DockerSandbox {
163
314
  buf = "";
164
315
  }
165
316
  if (code === 0) {
166
- resolvePromise(stdout);
317
+ resolvePromise();
167
318
  }
168
319
  else {
169
- reject(new Error(`Sandbox agent failed (exit ${code}): ${stderr || stdout || "no output"}`));
320
+ reject(new Error(`Sandbox agent failed (exit ${code}): ${stderrTail || "no output"}`));
170
321
  }
171
322
  });
172
323
  });
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/sandbox/docker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/sandbox/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,137 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { EventEmitter } from "events";
3
+ vi.mock("child_process", async (importOriginal) => {
4
+ const actual = await importOriginal();
5
+ return {
6
+ ...actual,
7
+ spawn: vi.fn(),
8
+ // create() runs `docker run` via execFileSync and polls readiness via
9
+ // execFile (promisified). Stub both so create() can be exercised without a
10
+ // real docker daemon.
11
+ execFileSync: vi.fn().mockReturnValue("container-xyz\n"),
12
+ execFile: vi.fn((_cmd, _args, opts, cb) => {
13
+ const done = (typeof opts === "function" ? opts : cb);
14
+ done(null, { stdout: "", stderr: "" });
15
+ }),
16
+ };
17
+ });
18
+ vi.mock("fs", async (importOriginal) => {
19
+ const actual = await importOriginal();
20
+ return { ...actual, existsSync: vi.fn().mockReturnValue(true), readFileSync: vi.fn().mockReturnValue("{}") };
21
+ });
22
+ import { spawn, execFileSync } from "child_process";
23
+ import { DockerSandbox } from "./docker.js";
24
+ const mockSpawn = vi.mocked(spawn);
25
+ const mockExecFileSync = vi.mocked(execFileSync);
26
+ function makeFakeChild() {
27
+ const stdin = { write: vi.fn(), end: vi.fn() };
28
+ const stdout = Object.assign(new EventEmitter(), { setEncoding: vi.fn() });
29
+ const stderr = Object.assign(new EventEmitter(), { setEncoding: vi.fn() });
30
+ const child = Object.assign(new EventEmitter(), { stdin, stdout, stderr, kill: vi.fn() });
31
+ return child;
32
+ }
33
+ describe("DockerSandbox.runAgent — prompt via stdin, not shell arg", () => {
34
+ let manager;
35
+ let fakeChild;
36
+ beforeEach(() => {
37
+ vi.clearAllMocks();
38
+ fakeChild = makeFakeChild();
39
+ mockSpawn.mockReturnValue(fakeChild);
40
+ manager = new DockerSandbox({
41
+ imageName: "test-image",
42
+ env: {},
43
+ timeoutSeconds: 5,
44
+ });
45
+ manager
46
+ .activeContainers.set("task-001", {
47
+ containerId: "abc123",
48
+ containerName: "test-container",
49
+ worktreePath: "/tmp/work",
50
+ });
51
+ });
52
+ it("spawn is called with stdin: 'pipe'", async () => {
53
+ const runPromise = manager.runAgent("task-001", "hello world");
54
+ process.nextTick(() => fakeChild.emit("close", 0));
55
+ await runPromise;
56
+ const spawnOpts = mockSpawn.mock.calls[0][2];
57
+ expect(spawnOpts.stdio[0]).toBe("pipe");
58
+ });
59
+ it("prompt is written to child.stdin", async () => {
60
+ const prompt = "Do something dangerous'; rm -rf /; echo '";
61
+ const runPromise = manager.runAgent("task-001", prompt);
62
+ process.nextTick(() => fakeChild.emit("close", 0));
63
+ await runPromise;
64
+ expect(fakeChild.stdin.write).toHaveBeenCalledWith(prompt);
65
+ expect(fakeChild.stdin.end).toHaveBeenCalled();
66
+ });
67
+ it("prompt is not embedded in the docker exec args", async () => {
68
+ const prompt = "secret'; rm -rf /;'";
69
+ const runPromise = manager.runAgent("task-001", prompt);
70
+ process.nextTick(() => fakeChild.emit("close", 0));
71
+ await runPromise;
72
+ const dockerArgs = mockSpawn.mock.calls[0][1].join(" ");
73
+ expect(dockerArgs).not.toContain(prompt);
74
+ expect(dockerArgs).not.toContain("rm -rf");
75
+ });
76
+ it("docker exec args contain -i flag for stdin", async () => {
77
+ const runPromise = manager.runAgent("task-001", "test prompt");
78
+ process.nextTick(() => fakeChild.emit("close", 0));
79
+ await runPromise;
80
+ const dockerArgs = mockSpawn.mock.calls[0][1];
81
+ expect(dockerArgs).toContain("-i");
82
+ });
83
+ it("agentic-pi command runs in --sandbox none mode and does not embed the prompt", async () => {
84
+ const runPromise = manager.runAgent("task-001", "test prompt");
85
+ process.nextTick(() => fakeChild.emit("close", 0));
86
+ await runPromise;
87
+ const dockerArgs = mockSpawn.mock.calls[0][1];
88
+ const shCmd = dockerArgs[dockerArgs.length - 1];
89
+ expect(shCmd).toContain("agentic-pi run");
90
+ expect(shCmd).toContain("--sandbox none");
91
+ expect(shCmd).not.toContain("--no-file-search");
92
+ expect(shCmd).not.toContain("test prompt");
93
+ });
94
+ });
95
+ describe("DockerSandbox.create — shared package cache (issue #107)", () => {
96
+ beforeEach(() => {
97
+ vi.clearAllMocks();
98
+ mockExecFileSync.mockReturnValue("container-xyz\n");
99
+ });
100
+ function dockerRunArgv() {
101
+ const call = mockExecFileSync.mock.calls.find((c) => Array.isArray(c[1]) && c[1][0] === "run");
102
+ return call?.[1] ?? [];
103
+ }
104
+ it("mounts the shared cache volume and wires npm/pnpm/yarn env", async () => {
105
+ const manager = new DockerSandbox({ imageName: "img", env: {} });
106
+ await manager.create({
107
+ taskId: "repo-1-pr-review",
108
+ worktreePath: "/tmp/work",
109
+ workspaceMount: { type: "bind", hostPath: "/tmp/work" },
110
+ });
111
+ const argv = dockerRunArgv();
112
+ expect(argv).toContain("lastlight_pkg-cache:/cache");
113
+ expect(argv).toContain("npm_config_cache=/cache/npm");
114
+ expect(argv).toContain("npm_config_store_dir=/cache/pnpm");
115
+ expect(argv).toContain("YARN_CACHE_FOLDER=/cache/yarn");
116
+ });
117
+ it("honours LASTLIGHT_PKG_CACHE_VOLUME override", async () => {
118
+ const prev = process.env.LASTLIGHT_PKG_CACHE_VOLUME;
119
+ process.env.LASTLIGHT_PKG_CACHE_VOLUME = "my-cache";
120
+ try {
121
+ const manager = new DockerSandbox({ imageName: "img", env: {} });
122
+ await manager.create({
123
+ taskId: "t",
124
+ worktreePath: "/tmp/work",
125
+ workspaceMount: { type: "bind", hostPath: "/tmp/work" },
126
+ });
127
+ expect(dockerRunArgv()).toContain("my-cache:/cache");
128
+ }
129
+ finally {
130
+ if (prev === undefined)
131
+ delete process.env.LASTLIGHT_PKG_CACHE_VOLUME;
132
+ else
133
+ process.env.LASTLIGHT_PKG_CACHE_VOLUME = prev;
134
+ }
135
+ });
136
+ });
137
+ //# sourceMappingURL=docker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.test.js","sourceRoot":"","sources":["../../src/sandbox/docker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Single source of truth for sandbox HTTP egress allowlists.
3
+ *
4
+ * Both sandbox backends consume this list:
5
+ * - gondolin: passed verbatim to `agenticRun({ allowedHttpHosts })` so the
6
+ * QEMU-layer HTTP interceptor 502s anything off-list.
7
+ * - docker: nginx-egress + coredns configs are generated from these hosts
8
+ * at harness boot. Sandbox containers spawn with `--dns <coredns-ip>`;
9
+ * coredns sinkholes allowlisted hostnames to the nginx firewall IP,
10
+ * which peeks SNI and tunnels to the real upstream. See
11
+ * `src/sandbox/egress-firewall-config.ts` for the full architecture.
12
+ *
13
+ * The lists are intentionally split so callers can compose tighter policies
14
+ * (e.g. a read-only profile that doesn't need package registries). The
15
+ * everyday default is `DEFAULT_ALLOWLIST`.
16
+ *
17
+ * ## Convention: every entry matches the apex AND all subdomains
18
+ *
19
+ * `openai.com` → matches openai.com, api.openai.com, platform.openai.com, …
20
+ * `npmjs.org` → matches npmjs.org, registry.npmjs.org, auth.npmjs.org, …
21
+ *
22
+ * Bare hostnames only — no leading dot, no `*.` prefix. The config
23
+ * generator emits the right syntax for each backend (nginx's
24
+ * `.example.com` map form, CoreDNS regex `(^|\.)example\.com\.$`).
25
+ *
26
+ * Exact-only matching isn't currently supported because we haven't
27
+ * needed it — every host in the list is one we want apex+subdomain
28
+ * access to. If we ever do, we'd add an explicit type (e.g. an `exact:`
29
+ * prefix) so the loose-by-default convention stays unambiguous.
30
+ *
31
+ * A workflow phase can declare `unrestricted_egress: true` to bypass the
32
+ * allowlist entirely — see `src/workflows` for the phase schema.
33
+ */
34
+ /** GitHub HTTPS endpoints used by `git`, `gh`, and agentic-pi's github tools. */
35
+ export declare const GITHUB_HOSTS: readonly string[];
36
+ /**
37
+ * LLM provider hosts.
38
+ *
39
+ * Required for the docker backend because `agentic-pi run` executes inside
40
+ * the sandbox container there (`src/sandbox/docker.ts` runs `agentic-pi run
41
+ * --sandbox none`), so the LLM HTTP call originates from inside the
42
+ * container. The gondolin backend runs agentic-pi in the harness process,
43
+ * so the call originates from the host and these hosts aren't strictly
44
+ * required inside the VM — they're kept here so a single allowlist can
45
+ * cover both paths without surprises.
46
+ */
47
+ export declare const PROVIDER_HOSTS: readonly string[];
48
+ /**
49
+ * Public package registries the executor may hit during `npm install`,
50
+ * etc. Apex-plus-subdomain matching covers auth / CDN / mirror
51
+ * subdomains without needing separate entries.
52
+ */
53
+ export declare const PACKAGE_REGISTRY_HOSTS: readonly string[];
54
+ /**
55
+ * Combined allowlist used by both backends when a phase has not opted into
56
+ * unrestricted egress. Order is preserved across imports so generated
57
+ * configs are stable.
58
+ */
59
+ export declare const DEFAULT_ALLOWLIST: readonly string[];
60
+ /**
61
+ * Sentinel value recognized by agentic-pi/gondolin (post the `"*"` patch)
62
+ * meaning "allow every host". Used when a phase sets `unrestricted_egress`.
63
+ *
64
+ * On the docker backend, unrestricted egress routes through the open
65
+ * nginx-egress + coredns-open pair — this sentinel is for gondolin only.
66
+ */
67
+ export declare const ALLOW_ALL_SENTINEL = "*";
68
+ export declare function normalizeAllowlistHost(host: string): string | null;
69
+ export declare function mergeAllowlist(base: readonly string[], extra?: readonly string[]): string[];