lastlight 0.16.0 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/README.md +71 -692
  2. package/dist/cli-config.js.map +1 -0
  3. package/dist/cli-format.js.map +1 -0
  4. package/dist/{cli/cli-server.d.ts → cli-server.d.ts} +39 -1
  5. package/dist/{cli/cli-server.js → cli-server.js} +105 -5
  6. package/dist/cli-server.js.map +1 -0
  7. package/dist/cli-timeline.js.map +1 -0
  8. package/dist/{cli/cli.js → cli.js} +9 -7
  9. package/dist/cli.js.map +1 -0
  10. package/dist/{cli/fork-cli.d.ts → fork-cli.d.ts} +3 -3
  11. package/dist/{cli/fork-cli.js → fork-cli.js} +28 -27
  12. package/dist/fork-cli.js.map +1 -0
  13. package/dist/{cli/oauth-cli.js → oauth-cli.js} +1 -1
  14. package/dist/oauth-cli.js.map +1 -0
  15. package/dist/{cli/setup.js → setup.js} +10 -4
  16. package/dist/setup.js.map +1 -0
  17. package/dist/{cli/skills-install.d.ts → skills-install.d.ts} +6 -0
  18. package/dist/{cli/skills-install.js → skills-install.js} +6 -2
  19. package/dist/skills-install.js.map +1 -0
  20. package/package.json +20 -65
  21. package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
  22. package/agent-context/rules.md +0 -80
  23. package/agent-context/security.md +0 -69
  24. package/agent-context/soul.md +0 -21
  25. package/config/default.yaml +0 -119
  26. package/deploy/.env.production.example +0 -100
  27. package/deploy/entrypoint.sh +0 -82
  28. package/deploy/native/README.md +0 -160
  29. package/deploy/native/install.sh +0 -110
  30. package/deploy/native/lastlight.env.example +0 -95
  31. package/deploy/native/lastlight.service +0 -50
  32. package/deploy/sandbox-entrypoint.sh +0 -93
  33. package/dist/admin/auth.d.ts +0 -51
  34. package/dist/admin/auth.js +0 -121
  35. package/dist/admin/auth.js.map +0 -1
  36. package/dist/admin/chat-session-reader.d.ts +0 -39
  37. package/dist/admin/chat-session-reader.js +0 -84
  38. package/dist/admin/chat-session-reader.js.map +0 -1
  39. package/dist/admin/docker.d.ts +0 -61
  40. package/dist/admin/docker.js +0 -187
  41. package/dist/admin/docker.js.map +0 -1
  42. package/dist/admin/index.d.ts +0 -9
  43. package/dist/admin/index.js +0 -59
  44. package/dist/admin/index.js.map +0 -1
  45. package/dist/admin/routes.d.ts +0 -81
  46. package/dist/admin/routes.js +0 -1381
  47. package/dist/admin/routes.js.map +0 -1
  48. package/dist/admin/sessions.d.ts +0 -89
  49. package/dist/admin/sessions.js +0 -204
  50. package/dist/admin/sessions.js.map +0 -1
  51. package/dist/admin/tail.d.ts +0 -12
  52. package/dist/admin/tail.js +0 -145
  53. package/dist/admin/tail.js.map +0 -1
  54. package/dist/admin/version.d.ts +0 -22
  55. package/dist/admin/version.js +0 -92
  56. package/dist/admin/version.js.map +0 -1
  57. package/dist/cli/cli-config.js.map +0 -1
  58. package/dist/cli/cli-format.js.map +0 -1
  59. package/dist/cli/cli-server.js.map +0 -1
  60. package/dist/cli/cli-timeline.js.map +0 -1
  61. package/dist/cli/cli.js.map +0 -1
  62. package/dist/cli/fork-cli.js.map +0 -1
  63. package/dist/cli/oauth-cli.js.map +0 -1
  64. package/dist/cli/setup.js.map +0 -1
  65. package/dist/cli/skills-install.js.map +0 -1
  66. package/dist/config/config-resolve.d.ts +0 -28
  67. package/dist/config/config-resolve.js +0 -47
  68. package/dist/config/config-resolve.js.map +0 -1
  69. package/dist/config/config.d.ts +0 -157
  70. package/dist/config/config.js +0 -581
  71. package/dist/config/config.js.map +0 -1
  72. package/dist/config/core-pin.d.ts +0 -16
  73. package/dist/config/core-pin.js +0 -85
  74. package/dist/config/core-pin.js.map +0 -1
  75. package/dist/config/overlay-assets.d.ts +0 -20
  76. package/dist/config/overlay-assets.js +0 -114
  77. package/dist/config/overlay-assets.js.map +0 -1
  78. package/dist/config/overlay-bootstrap.d.ts +0 -44
  79. package/dist/config/overlay-bootstrap.js +0 -304
  80. package/dist/config/overlay-bootstrap.js.map +0 -1
  81. package/dist/connectors/github-webhook.d.ts +0 -45
  82. package/dist/connectors/github-webhook.js +0 -321
  83. package/dist/connectors/github-webhook.js.map +0 -1
  84. package/dist/connectors/index.d.ts +0 -18
  85. package/dist/connectors/index.js +0 -41
  86. package/dist/connectors/index.js.map +0 -1
  87. package/dist/connectors/messaging/base.d.ts +0 -42
  88. package/dist/connectors/messaging/base.js +0 -139
  89. package/dist/connectors/messaging/base.js.map +0 -1
  90. package/dist/connectors/messaging/delivery.d.ts +0 -14
  91. package/dist/connectors/messaging/delivery.js +0 -38
  92. package/dist/connectors/messaging/delivery.js.map +0 -1
  93. package/dist/connectors/messaging/index.d.ts +0 -4
  94. package/dist/connectors/messaging/index.js +0 -4
  95. package/dist/connectors/messaging/index.js.map +0 -1
  96. package/dist/connectors/messaging/session-manager.d.ts +0 -53
  97. package/dist/connectors/messaging/session-manager.js +0 -255
  98. package/dist/connectors/messaging/session-manager.js.map +0 -1
  99. package/dist/connectors/messaging/types.d.ts +0 -58
  100. package/dist/connectors/messaging/types.js +0 -7
  101. package/dist/connectors/messaging/types.js.map +0 -1
  102. package/dist/connectors/slack/connector.d.ts +0 -142
  103. package/dist/connectors/slack/connector.js +0 -494
  104. package/dist/connectors/slack/connector.js.map +0 -1
  105. package/dist/connectors/slack/index.d.ts +0 -2
  106. package/dist/connectors/slack/index.js +0 -3
  107. package/dist/connectors/slack/index.js.map +0 -1
  108. package/dist/connectors/slack/mrkdwn.d.ts +0 -19
  109. package/dist/connectors/slack/mrkdwn.js +0 -240
  110. package/dist/connectors/slack/mrkdwn.js.map +0 -1
  111. package/dist/connectors/types.d.ts +0 -61
  112. package/dist/connectors/types.js +0 -2
  113. package/dist/connectors/types.js.map +0 -1
  114. package/dist/cron/fanout.d.ts +0 -33
  115. package/dist/cron/fanout.js +0 -55
  116. package/dist/cron/fanout.js.map +0 -1
  117. package/dist/cron/jobs.d.ts +0 -18
  118. package/dist/cron/jobs.js +0 -37
  119. package/dist/cron/jobs.js.map +0 -1
  120. package/dist/cron/scheduler.d.ts +0 -45
  121. package/dist/cron/scheduler.js +0 -105
  122. package/dist/cron/scheduler.js.map +0 -1
  123. package/dist/engine/agent-executor.d.ts +0 -34
  124. package/dist/engine/agent-executor.js +0 -246
  125. package/dist/engine/agent-executor.js.map +0 -1
  126. package/dist/engine/chat/chat-runner.d.ts +0 -132
  127. package/dist/engine/chat/chat-runner.js +0 -424
  128. package/dist/engine/chat/chat-runner.js.map +0 -1
  129. package/dist/engine/chat/chat-skills.d.ts +0 -45
  130. package/dist/engine/chat/chat-skills.js +0 -184
  131. package/dist/engine/chat/chat-skills.js.map +0 -1
  132. package/dist/engine/chat/chat.d.ts +0 -54
  133. package/dist/engine/chat/chat.js +0 -316
  134. package/dist/engine/chat/chat.js.map +0 -1
  135. package/dist/engine/chat/message-batcher.d.ts +0 -32
  136. package/dist/engine/chat/message-batcher.js +0 -109
  137. package/dist/engine/chat/message-batcher.js.map +0 -1
  138. package/dist/engine/dispatcher.d.ts +0 -73
  139. package/dist/engine/dispatcher.js +0 -663
  140. package/dist/engine/dispatcher.js.map +0 -1
  141. package/dist/engine/event-shim.d.ts +0 -117
  142. package/dist/engine/event-shim.js +0 -435
  143. package/dist/engine/event-shim.js.map +0 -1
  144. package/dist/engine/executors/orchestrator.d.ts +0 -81
  145. package/dist/engine/executors/orchestrator.js +0 -365
  146. package/dist/engine/executors/orchestrator.js.map +0 -1
  147. package/dist/engine/executors/shared.d.ts +0 -189
  148. package/dist/engine/executors/shared.js +0 -616
  149. package/dist/engine/executors/shared.js.map +0 -1
  150. package/dist/engine/github/git-auth.d.ts +0 -62
  151. package/dist/engine/github/git-auth.js +0 -161
  152. package/dist/engine/github/git-auth.js.map +0 -1
  153. package/dist/engine/github/github-app-client.d.ts +0 -23
  154. package/dist/engine/github/github-app-client.js +0 -33
  155. package/dist/engine/github/github-app-client.js.map +0 -1
  156. package/dist/engine/github/github-tools.d.ts +0 -18
  157. package/dist/engine/github/github-tools.js +0 -263
  158. package/dist/engine/github/github-tools.js.map +0 -1
  159. package/dist/engine/github/github.d.ts +0 -1193
  160. package/dist/engine/github/github.js +0 -357
  161. package/dist/engine/github/github.js.map +0 -1
  162. package/dist/engine/github/profiles.d.ts +0 -279
  163. package/dist/engine/github/profiles.js +0 -42
  164. package/dist/engine/github/profiles.js.map +0 -1
  165. package/dist/engine/github/review-poster.d.ts +0 -98
  166. package/dist/engine/github/review-poster.js +0 -177
  167. package/dist/engine/github/review-poster.js.map +0 -1
  168. package/dist/engine/llm.d.ts +0 -79
  169. package/dist/engine/llm.js +0 -269
  170. package/dist/engine/llm.js.map +0 -1
  171. package/dist/engine/oauth.d.ts +0 -43
  172. package/dist/engine/oauth.js +0 -103
  173. package/dist/engine/oauth.js.map +0 -1
  174. package/dist/engine/router.d.ts +0 -29
  175. package/dist/engine/router.js +0 -680
  176. package/dist/engine/router.js.map +0 -1
  177. package/dist/engine/screen/classifier.d.ts +0 -93
  178. package/dist/engine/screen/classifier.js +0 -215
  179. package/dist/engine/screen/classifier.js.map +0 -1
  180. package/dist/engine/screen/screen.d.ts +0 -41
  181. package/dist/engine/screen/screen.js +0 -93
  182. package/dist/engine/screen/screen.js.map +0 -1
  183. package/dist/evals-api.d.ts +0 -24
  184. package/dist/evals-api.js +0 -22
  185. package/dist/evals-api.js.map +0 -1
  186. package/dist/index.d.ts +0 -1
  187. package/dist/index.js +0 -940
  188. package/dist/index.js.map +0 -1
  189. package/dist/managed-repos.d.ts +0 -30
  190. package/dist/managed-repos.js +0 -72
  191. package/dist/managed-repos.js.map +0 -1
  192. package/dist/notify/blocks.d.ts +0 -23
  193. package/dist/notify/blocks.js +0 -118
  194. package/dist/notify/blocks.js.map +0 -1
  195. package/dist/notify/index.d.ts +0 -17
  196. package/dist/notify/index.js +0 -7
  197. package/dist/notify/index.js.map +0 -1
  198. package/dist/notify/model.d.ts +0 -57
  199. package/dist/notify/model.js +0 -89
  200. package/dist/notify/model.js.map +0 -1
  201. package/dist/notify/notifier.d.ts +0 -18
  202. package/dist/notify/notifier.js +0 -100
  203. package/dist/notify/notifier.js.map +0 -1
  204. package/dist/notify/render.d.ts +0 -21
  205. package/dist/notify/render.js +0 -59
  206. package/dist/notify/render.js.map +0 -1
  207. package/dist/notify/transports/github.d.ts +0 -26
  208. package/dist/notify/transports/github.js +0 -27
  209. package/dist/notify/transports/github.js.map +0 -1
  210. package/dist/notify/transports/slack.d.ts +0 -27
  211. package/dist/notify/transports/slack.js +0 -37
  212. package/dist/notify/transports/slack.js.map +0 -1
  213. package/dist/notify/types.d.ts +0 -119
  214. package/dist/notify/types.js +0 -16
  215. package/dist/notify/types.js.map +0 -1
  216. package/dist/providers.d.ts +0 -125
  217. package/dist/providers.js +0 -279
  218. package/dist/providers.js.map +0 -1
  219. package/dist/sandbox/docker.d.ts +0 -180
  220. package/dist/sandbox/docker.js +0 -517
  221. package/dist/sandbox/docker.js.map +0 -1
  222. package/dist/sandbox/egress-allowlist.d.ts +0 -74
  223. package/dist/sandbox/egress-allowlist.js +0 -164
  224. package/dist/sandbox/egress-allowlist.js.map +0 -1
  225. package/dist/sandbox/egress-firewall-config.d.ts +0 -127
  226. package/dist/sandbox/egress-firewall-config.js +0 -434
  227. package/dist/sandbox/egress-firewall-config.js.map +0 -1
  228. package/dist/sandbox/images.d.ts +0 -23
  229. package/dist/sandbox/images.js +0 -55
  230. package/dist/sandbox/images.js.map +0 -1
  231. package/dist/sandbox/index.d.ts +0 -112
  232. package/dist/sandbox/index.js +0 -332
  233. package/dist/sandbox/index.js.map +0 -1
  234. package/dist/sandbox/sandbox.d.ts +0 -214
  235. package/dist/sandbox/sandbox.js +0 -453
  236. package/dist/sandbox/sandbox.js.map +0 -1
  237. package/dist/sandbox/smol.d.ts +0 -162
  238. package/dist/sandbox/smol.js +0 -485
  239. package/dist/sandbox/smol.js.map +0 -1
  240. package/dist/session-log.d.ts +0 -63
  241. package/dist/session-log.js +0 -290
  242. package/dist/session-log.js.map +0 -1
  243. package/dist/state/approval-store.d.ts +0 -88
  244. package/dist/state/approval-store.js +0 -149
  245. package/dist/state/approval-store.js.map +0 -1
  246. package/dist/state/build-assets.d.ts +0 -50
  247. package/dist/state/build-assets.js +0 -154
  248. package/dist/state/build-assets.js.map +0 -1
  249. package/dist/state/db.d.ts +0 -81
  250. package/dist/state/db.js +0 -155
  251. package/dist/state/db.js.map +0 -1
  252. package/dist/state/execution-store.d.ts +0 -257
  253. package/dist/state/execution-store.js +0 -527
  254. package/dist/state/execution-store.js.map +0 -1
  255. package/dist/state/migrate.d.ts +0 -15
  256. package/dist/state/migrate.js +0 -175
  257. package/dist/state/migrate.js.map +0 -1
  258. package/dist/state/workflow-run-store.d.ts +0 -216
  259. package/dist/state/workflow-run-store.js +0 -403
  260. package/dist/state/workflow-run-store.js.map +0 -1
  261. package/dist/telemetry/index.d.ts +0 -38
  262. package/dist/telemetry/index.js +0 -253
  263. package/dist/telemetry/index.js.map +0 -1
  264. package/dist/telemetry/pi-events.d.ts +0 -12
  265. package/dist/telemetry/pi-events.js +0 -134
  266. package/dist/telemetry/pi-events.js.map +0 -1
  267. package/dist/workflows/dag.d.ts +0 -37
  268. package/dist/workflows/dag.js +0 -118
  269. package/dist/workflows/dag.js.map +0 -1
  270. package/dist/workflows/loader.d.ts +0 -53
  271. package/dist/workflows/loader.js +0 -421
  272. package/dist/workflows/loader.js.map +0 -1
  273. package/dist/workflows/loop-eval.d.ts +0 -28
  274. package/dist/workflows/loop-eval.js +0 -74
  275. package/dist/workflows/loop-eval.js.map +0 -1
  276. package/dist/workflows/phase-executor.d.ts +0 -222
  277. package/dist/workflows/phase-executor.js +0 -1153
  278. package/dist/workflows/phase-executor.js.map +0 -1
  279. package/dist/workflows/phase-ref.d.ts +0 -50
  280. package/dist/workflows/phase-ref.js +0 -91
  281. package/dist/workflows/phase-ref.js.map +0 -1
  282. package/dist/workflows/resume.d.ts +0 -58
  283. package/dist/workflows/resume.js +0 -313
  284. package/dist/workflows/resume.js.map +0 -1
  285. package/dist/workflows/runner.d.ts +0 -63
  286. package/dist/workflows/runner.js +0 -381
  287. package/dist/workflows/runner.js.map +0 -1
  288. package/dist/workflows/schema.d.ts +0 -344
  289. package/dist/workflows/schema.js +0 -460
  290. package/dist/workflows/schema.js.map +0 -1
  291. package/dist/workflows/simple.d.ts +0 -90
  292. package/dist/workflows/simple.js +0 -393
  293. package/dist/workflows/simple.js.map +0 -1
  294. package/dist/workflows/target-policy.d.ts +0 -74
  295. package/dist/workflows/target-policy.js +0 -80
  296. package/dist/workflows/target-policy.js.map +0 -1
  297. package/dist/workflows/templates.d.ts +0 -88
  298. package/dist/workflows/templates.js +0 -127
  299. package/dist/workflows/templates.js.map +0 -1
  300. package/dist/workflows/triggers.d.ts +0 -21
  301. package/dist/workflows/triggers.js +0 -45
  302. package/dist/workflows/triggers.js.map +0 -1
  303. package/dist/workflows/verdict.d.ts +0 -19
  304. package/dist/workflows/verdict.js +0 -30
  305. package/dist/workflows/verdict.js.map +0 -1
  306. package/dist/worktree/manager.d.ts +0 -43
  307. package/dist/worktree/manager.js +0 -127
  308. package/dist/worktree/manager.js.map +0 -1
  309. package/docker-compose.yml +0 -274
  310. package/sandbox.Dockerfile +0 -68
  311. package/skills/README.md +0 -42
  312. package/skills/browser-qa/SKILL.md +0 -208
  313. package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
  314. package/skills/building/SKILL.md +0 -95
  315. package/skills/chat/SKILL.md +0 -36
  316. package/skills/code-review/SKILL.md +0 -82
  317. package/skills/debug-production/SKILL.md +0 -108
  318. package/skills/demo/SKILL.md +0 -228
  319. package/skills/demo/scripts/compose-demo.sh +0 -243
  320. package/skills/issue-answer/SKILL.md +0 -91
  321. package/skills/issue-comment/SKILL.md +0 -49
  322. package/skills/issue-triage/SKILL.md +0 -149
  323. package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
  324. package/skills/pr-comment/SKILL.md +0 -64
  325. package/skills/pr-review/SKILL.md +0 -148
  326. package/skills/pr-review/references/findings-schema.md +0 -89
  327. package/skills/qa-test/SKILL.md +0 -97
  328. package/skills/repo-health/SKILL.md +0 -67
  329. package/skills/security-feedback/SKILL.md +0 -173
  330. package/skills/security-feedback/references/templates.md +0 -77
  331. package/skills/security-review/SKILL.md +0 -215
  332. package/skills/security-review/references/issue-format.md +0 -302
  333. package/skills/verify/SKILL.md +0 -118
  334. package/workflows/answer.yaml +0 -44
  335. package/workflows/build.yaml +0 -129
  336. package/workflows/cron-health.yaml +0 -6
  337. package/workflows/cron-review.yaml +0 -8
  338. package/workflows/cron-security.yaml +0 -6
  339. package/workflows/cron-triage.yaml +0 -8
  340. package/workflows/demo.yaml +0 -62
  341. package/workflows/examples/bash-smoke.yaml +0 -41
  342. package/workflows/examples/parallel-review.yaml +0 -36
  343. package/workflows/examples/tdd-loop.yaml +0 -17
  344. package/workflows/explore.yaml +0 -80
  345. package/workflows/issue-comment.yaml +0 -15
  346. package/workflows/issue-triage.yaml +0 -22
  347. package/workflows/pr-comment.yaml +0 -16
  348. package/workflows/pr-fix.yaml +0 -17
  349. package/workflows/pr-review.yaml +0 -50
  350. package/workflows/prompts/answer.md +0 -68
  351. package/workflows/prompts/architect.md +0 -44
  352. package/workflows/prompts/classifier.md +0 -60
  353. package/workflows/prompts/classify-adds-info.md +0 -17
  354. package/workflows/prompts/demo.md +0 -125
  355. package/workflows/prompts/executor.md +0 -42
  356. package/workflows/prompts/explore-ask.md +0 -99
  357. package/workflows/prompts/explore-publish.md +0 -31
  358. package/workflows/prompts/explore-read.md +0 -120
  359. package/workflows/prompts/explore-synthesize.md +0 -88
  360. package/workflows/prompts/fix.md +0 -18
  361. package/workflows/prompts/guardrails.md +0 -96
  362. package/workflows/prompts/pr-fix.md +0 -26
  363. package/workflows/prompts/pr.md +0 -39
  364. package/workflows/prompts/qa-browser.md +0 -95
  365. package/workflows/prompts/qa-synth.md +0 -44
  366. package/workflows/prompts/qa-test.md +0 -60
  367. package/workflows/prompts/re-reviewer.md +0 -33
  368. package/workflows/prompts/reviewer.md +0 -60
  369. package/workflows/prompts/verify-browser.md +0 -93
  370. package/workflows/prompts/verify-synth.md +0 -44
  371. package/workflows/prompts/verify.md +0 -63
  372. package/workflows/qa-test.yaml +0 -94
  373. package/workflows/repo-health.yaml +0 -15
  374. package/workflows/security-feedback.yaml +0 -25
  375. package/workflows/security-review.yaml +0 -37
  376. package/workflows/verify.yaml +0 -93
  377. /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
  378. /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
  379. /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
  380. /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
  381. /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
  382. /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
  383. /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
  384. /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
  385. /package/dist/{cli/setup.d.ts → setup.d.ts} +0 -0
@@ -1,485 +0,0 @@
1
- import { execFileSync, execFile as execFileCb, spawn } from "child_process";
2
- import { promisify } from "util";
3
- import { lookup } from "node:dns/promises";
4
- import { existsSync, readdirSync } from "fs";
5
- import { join, resolve } from "path";
6
- import { randomUUID } from "crypto";
7
- const execFileAsync = promisify(execFileCb);
8
- /**
9
- * smolvm sandbox manager — runs agent tasks inside local micro-VMs.
10
- *
11
- * Structural peer of {@link DockerSandbox}: Last Light owns the isolation
12
- * boundary, bind-mounts the per-task workspace, runs `agentic-pi run --sandbox
13
- * none` *inside* the machine, and parses the JSONL event stream exactly as the
14
- * docker path does. Differences from docker:
15
- *
16
- * - **Isolation** is a real micro-VM (own kernel) via smolvm's host
17
- * hypervisor (Apple Silicon Hypervisor.framework / Linux KVM), not a
18
- * sibling container. No daemon, no Docker (smolvm drives the hypervisor
19
- * directly).
20
- * - **Egress** is enforced natively per-machine via `--allow-host` (sourced
21
- * from `egress-allowlist.ts`), so this backend needs none of the coredns +
22
- * nginx-egress sidecar stack. `--allow-host` implies `--net`; we always
23
- * enable networking (the agent must reach the LLM provider).
24
- * - **Secrets** (provider keys, GITHUB_TOKEN) are injected via smolvm's
25
- * `--secret-env GUEST=HOST` so values never appear on the argv — the host
26
- * env of the spawned `smolvm` process carries them; smolvm resolves them
27
- * into the guest at start.
28
- * - **Image** is whatever `SMOLVM_IMAGE` names. smolvm's `-I` accepts a
29
- * registry ref OR a local `docker save` archive (`./img.tar`) / unpacked
30
- * rootfs dir — the latter needs NO registry, so it works under the strict
31
- * egress allowlist. The lastlight sandbox image (built locally by docker)
32
- * is consumed offline via `docker save lastlight-sandbox:latest -o img.tar`
33
- * then `SMOLVM_IMAGE=img.tar`. Archives are cached by hash; `start` resolves
34
- * from cache, not the network.
35
- *
36
- * Driven via the **smolvm CLI** (`execFile`), verified against smolvm 1.2.5.
37
- *
38
- * Feasibility-spike scope (documented gaps vs docker):
39
- * - We exec `agentic-pi` directly rather than running the sandbox image's
40
- * entrypoint, so the entrypoint's git-credential-helper setup is skipped.
41
- * Read-only profiles (agentic-pi's built-in github tools + minted
42
- * GITHUB_TOKEN) work; repo-write `git push` from the workspace is out of
43
- * scope here.
44
- * - The workload runs VM-grade (root) by default; workspace writes land as
45
- * root on the host bind mount. No shared package-manager cache, no SSRF
46
- * metadata floor in unrestricted mode, no in-network OTEL collector.
47
- * - The image (`SMOLVM_IMAGE`) must be resolvable by smolvm (a registry ref,
48
- * or a local image it can load) — see the spike plan's verification steps.
49
- */
50
- /**
51
- * Where the per-task workspace is bind-mounted inside the guest. smolvm treats
52
- * `/workspace` specially — a `-v <host>:/workspace` mount "takes priority" and
53
- * the host share is used directly (instead of the VM's storage-disk workspace),
54
- * which avoids the `virtiofs` carve-out other mount targets get. The probe in
55
- * {@link SmolSandbox.resolveHostWorkspace} still confirms the actual host path.
56
- */
57
- export const SMOL_WORKSPACE_DIR = "/workspace";
58
- /** Binary used to drive smolvm. Overridable for dev/CI (e.g. a vendored build). */
59
- function smolBin() {
60
- return process.env.SMOLVM_BIN || "smolvm";
61
- }
62
- /**
63
- * OCI image the micro-VM boots. Reuses the lean lastlight sandbox image by
64
- * default (agentic-pi + node + git + gh baked in); the image must be
65
- * resolvable by smolvm (see the spike plan's verification steps).
66
- */
67
- function smolImage() {
68
- return process.env.SMOLVM_IMAGE || "lastlight-sandbox:latest";
69
- }
70
- /** Cached probe — only check the smolvm binary once per process. */
71
- let _smolAvailable = null;
72
- /** True when the smolvm CLI is invocable on this host. */
73
- export function smolAvailable() {
74
- if (_smolAvailable === null) {
75
- try {
76
- execFileSync(smolBin(), ["--version"], { stdio: "ignore", timeout: 5000 });
77
- _smolAvailable = true;
78
- console.log(`[smol] smolvm available (image: ${smolImage()})`);
79
- }
80
- catch {
81
- _smolAvailable = false;
82
- console.log("[smol] smolvm CLI not available — smol backend unavailable");
83
- }
84
- }
85
- return _smolAvailable;
86
- }
87
- const THINKING = new Set(["off", "minimal", "low", "medium", "high", "xhigh"]);
88
- const PROFILES = new Set(["read", "issues-write", "review-write", "repo-write"]);
89
- const WEB_SEARCH_PROVIDERS = new Set(["tavily", "brave", "exa"]);
90
- const HOST_RE = /^[A-Za-z0-9.-]+$/;
91
- const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
92
- const PATH_RE = /^[A-Za-z0-9/_.-]+$/;
93
- export class SmolSandbox {
94
- config;
95
- machines = new Map();
96
- constructor(config) {
97
- this.config = config;
98
- }
99
- /** Create + start a micro-VM with the workspace bind-mounted and egress locked. */
100
- async create(opts) {
101
- const machineName = `lastlight-smol-${sanitizeName(opts.taskId)}-${randomUUID().slice(0, 8)}`;
102
- const worktreePath = resolve(opts.worktreePath);
103
- // smolvm machine create -n <name> -I <image> -v <host>:<guest> \
104
- // --net [--allow-host <h>]...
105
- // smolvm machine start --name <name>
106
- const allowFlags = (await this.resolvableAllowHosts()).flatMap((h) => ["--allow-host", h]);
107
- const args = [
108
- "machine", "create",
109
- "-n", machineName,
110
- "-I", this.config.imageName || smolImage(),
111
- "-v", `${worktreePath}:${SMOL_WORKSPACE_DIR}`,
112
- "--net",
113
- ...allowFlags,
114
- ];
115
- try {
116
- execCmd(smolBin(), args, { timeout: 60_000 });
117
- execCmd(smolBin(), ["machine", "start", "--name", machineName], { timeout: 120_000 });
118
- }
119
- catch (err) {
120
- execSafe(smolBin(), ["machine", "delete", "-f", "--name", machineName]);
121
- throw new Error(`Failed to create smol sandbox: ${err.message}`);
122
- }
123
- console.log(`[smol] Created: ${machineName}`);
124
- await this.waitForReady(machineName);
125
- const hostWorkspace = await this.resolveHostWorkspace(machineName, worktreePath);
126
- const info = { machineName, worktreePath, hostWorkspace };
127
- this.machines.set(opts.taskId, info);
128
- return info;
129
- }
130
- /**
131
- * Discover the host directory that backs the guest workspace mount. Writes a
132
- * sentinel file from inside the guest at {@link SMOL_WORKSPACE_DIR}, then
133
- * locates it under the mount source on the host — its parent dir is the
134
- * host-side workspace root. Falls back to the source root if not found
135
- * (e.g. a future smolvm that shares the source directly and the scan misses).
136
- */
137
- async resolveHostWorkspace(machineName, worktreePath) {
138
- const sentinel = `.smol-probe-${randomUUID().slice(0, 8)}`;
139
- try {
140
- await execFileAsync(smolBin(), ["machine", "exec", "--name", machineName, "--", "sh", "-c", `: > ${SMOL_WORKSPACE_DIR}/${sentinel}`], { timeout: 10_000 });
141
- const hit = findFileUnder(worktreePath, sentinel, 4);
142
- await execFileAsync(smolBin(), ["machine", "exec", "--name", machineName, "--", "rm", "-f", `${SMOL_WORKSPACE_DIR}/${sentinel}`], { timeout: 10_000 }).catch(() => { });
143
- if (hit) {
144
- const dir = hit.slice(0, hit.length - sentinel.length - 1);
145
- if (dir !== worktreePath)
146
- console.log(`[smol] Workspace share lands at ${dir} (not the source root)`);
147
- return dir;
148
- }
149
- }
150
- catch (err) {
151
- console.warn(`[smol] Could not probe workspace mount (${err.message}) — assuming source root`);
152
- }
153
- return worktreePath;
154
- }
155
- /** Wait until the machine can run a trivial command (boot completion). */
156
- async waitForReady(machineName, timeoutMs = 20000) {
157
- const start = Date.now();
158
- while (Date.now() - start < timeoutMs) {
159
- try {
160
- await execFileAsync(smolBin(), ["machine", "exec", "--name", machineName, "--", "true"], { timeout: 5000 });
161
- return;
162
- }
163
- catch {
164
- await new Promise((r) => setTimeout(r, 500));
165
- }
166
- }
167
- console.warn(`[smol] Timed out waiting for ${machineName} to be ready — proceeding anyway`);
168
- }
169
- /**
170
- * Run `agentic-pi run --sandbox none …` inside the machine. Mirrors
171
- * {@link DockerSandbox.runAgent}: streams stdout line-by-line for the live
172
- * shim and writes the prompt to the child's stdin (`-i`). The agentic-pi
173
- * argv is passed directly after `--` (no `sh -c`), so no shell quoting.
174
- */
175
- async runAgent(taskId, prompt, opts) {
176
- const info = this.machines.get(taskId);
177
- if (!info)
178
- throw new Error(`No smol machine for task ${taskId}`);
179
- const model = opts?.model || "anthropic/claude-sonnet-4-6";
180
- const timeout = this.config.timeoutSeconds || 1800;
181
- const piArgs = ["agentic-pi", "run", "--model", model, "--sandbox", "none"];
182
- if (opts?.thinking) {
183
- if (!THINKING.has(opts.thinking)) {
184
- throw new Error(`Refusing to pass thinking "${opts.thinking}" — must be one of ${[...THINKING].join("|")}`);
185
- }
186
- piArgs.push("--thinking", opts.thinking);
187
- }
188
- if (opts?.profile) {
189
- if (!PROFILES.has(opts.profile)) {
190
- throw new Error(`Refusing to pass profile "${opts.profile}" — must be one of ${[...PROFILES].join("|")}`);
191
- }
192
- piArgs.push("--profile", opts.profile);
193
- }
194
- if (opts?.webSearch === true) {
195
- if (opts.webSearchProvider) {
196
- if (!WEB_SEARCH_PROVIDERS.has(opts.webSearchProvider)) {
197
- throw new Error(`Refusing to pass web-search-provider "${opts.webSearchProvider}" — must be one of ${[...WEB_SEARCH_PROVIDERS].join("|")}`);
198
- }
199
- piArgs.push("--web-search-provider", opts.webSearchProvider);
200
- }
201
- }
202
- else {
203
- piArgs.push("--no-web-search");
204
- }
205
- for (const dir of opts?.skillDirs ?? []) {
206
- if (!dir.startsWith(SMOL_WORKSPACE_DIR) || !PATH_RE.test(dir)) {
207
- throw new Error(`Refusing to pass skill dir "${dir}" — must live under ${SMOL_WORKSPACE_DIR}`);
208
- }
209
- piArgs.push("--skill", dir);
210
- }
211
- if (!PATH_RE.test(model)) {
212
- throw new Error(`Refusing to pass model "${model}" — bad charset`);
213
- }
214
- // Passed as a single argv token each (no shell), so `KEY=VALUE` is literal.
215
- for (const [k, v] of Object.entries(opts?.sandboxEnv ?? {})) {
216
- if (!ENV_KEY_RE.test(k))
217
- throw new Error(`Refusing sandbox-env key "${k}" — bad charset`);
218
- if (/[\n\r]/.test(v))
219
- throw new Error(`Refusing sandbox-env value for "${k}" — contains newline`);
220
- piArgs.push("--sandbox-env", `${k}=${v}`);
221
- }
222
- const workdir = opts?.agentCwd ?? SMOL_WORKSPACE_DIR;
223
- if (!workdir.startsWith(SMOL_WORKSPACE_DIR) || !PATH_RE.test(workdir)) {
224
- throw new Error(`Refusing to pass agent cwd "${workdir}" — must live under ${SMOL_WORKSPACE_DIR}`);
225
- }
226
- const { flags: secretFlags, childEnv } = this.secretEnv();
227
- const argv = [
228
- "machine", "exec", "--name", info.machineName,
229
- "-w", workdir, "-i",
230
- ...secretFlags,
231
- "--", ...piArgs,
232
- ];
233
- const STDERR_TAIL_BYTES = 8 * 1024;
234
- return await new Promise((resolvePromise, reject) => {
235
- const child = spawn(smolBin(), argv, { stdio: ["pipe", "pipe", "pipe"], env: childEnv });
236
- child.stdin.write(prompt);
237
- child.stdin.end();
238
- let stderrTail = "";
239
- let buf = "";
240
- const timer = setTimeout(() => {
241
- child.kill("SIGKILL");
242
- reject(new Error(`Smol agent timed out after ${timeout}s`));
243
- }, timeout * 1000);
244
- child.stdout.setEncoding("utf-8");
245
- child.stdout.on("data", (chunk) => {
246
- if (!opts?.onLine)
247
- return;
248
- buf += chunk;
249
- let nl;
250
- while ((nl = buf.indexOf("\n")) >= 0) {
251
- const line = buf.slice(0, nl);
252
- buf = buf.slice(nl + 1);
253
- if (line.length > 0) {
254
- try {
255
- opts.onLine(line);
256
- }
257
- catch { /* swallow listener errors */ }
258
- }
259
- }
260
- });
261
- child.stderr.setEncoding("utf-8");
262
- child.stderr.on("data", (chunk) => {
263
- stderrTail += chunk;
264
- if (stderrTail.length > STDERR_TAIL_BYTES)
265
- stderrTail = stderrTail.slice(-STDERR_TAIL_BYTES);
266
- });
267
- child.on("error", (err) => {
268
- clearTimeout(timer);
269
- reject(new Error(`Smol agent spawn failed: ${err.message}`));
270
- });
271
- child.on("close", (code) => {
272
- clearTimeout(timer);
273
- if (buf.length > 0 && opts?.onLine) {
274
- try {
275
- opts.onLine(buf);
276
- }
277
- catch { /* ignore */ }
278
- }
279
- if (code === 0)
280
- resolvePromise();
281
- else
282
- reject(new Error(`Smol agent failed (exit ${code}): ${stderrTail || "no output"}`));
283
- });
284
- });
285
- }
286
- /**
287
- * Run a deterministic shell command in the machine and resolve with its exit
288
- * code + bounded output. Non-agent sibling of {@link runAgent}; powers
289
- * `type: bash` / `type: script` phases. The command is a shell string, so it
290
- * runs under `sh -c`.
291
- */
292
- async runCommand(taskId, command, opts) {
293
- const info = this.machines.get(taskId);
294
- if (!info)
295
- throw new Error(`No smol machine for task ${taskId}`);
296
- const timeout = opts?.timeoutSeconds || this.config.timeoutSeconds || 1800;
297
- const workdir = opts?.cwd ?? SMOL_WORKSPACE_DIR;
298
- if (!workdir.startsWith(SMOL_WORKSPACE_DIR) || !PATH_RE.test(workdir)) {
299
- throw new Error(`Refusing to run command in cwd "${workdir}" — must live under ${SMOL_WORKSPACE_DIR}`);
300
- }
301
- const envFlags = [];
302
- for (const [k, v] of Object.entries(opts?.sandboxEnv ?? {})) {
303
- if (!ENV_KEY_RE.test(k))
304
- throw new Error(`Refusing sandbox-env key "${k}" — bad charset`);
305
- if (/[\n\r]/.test(v))
306
- throw new Error(`Refusing sandbox-env value for "${k}" — contains newline`);
307
- envFlags.push("-e", `${k}=${v}`);
308
- }
309
- const { flags: secretFlags, childEnv } = this.secretEnv();
310
- const argv = [
311
- "machine", "exec", "--name", info.machineName,
312
- "-w", workdir,
313
- ...envFlags, ...secretFlags,
314
- "--", "sh", "-c", command,
315
- ];
316
- const STDOUT_TAIL_BYTES = 256 * 1024;
317
- const STDERR_TAIL_BYTES = 32 * 1024;
318
- return await new Promise((resolvePromise, reject) => {
319
- const child = spawn(smolBin(), argv, { stdio: ["ignore", "pipe", "pipe"], env: childEnv });
320
- let stdoutTail = "";
321
- let stderrTail = "";
322
- let buf = "";
323
- let timedOut = false;
324
- const timer = setTimeout(() => {
325
- timedOut = true;
326
- child.kill("SIGKILL");
327
- }, timeout * 1000);
328
- child.stdout.setEncoding("utf-8");
329
- child.stdout.on("data", (chunk) => {
330
- stdoutTail += chunk;
331
- if (stdoutTail.length > STDOUT_TAIL_BYTES)
332
- stdoutTail = stdoutTail.slice(-STDOUT_TAIL_BYTES);
333
- if (!opts?.onLine)
334
- return;
335
- buf += chunk;
336
- let nl;
337
- while ((nl = buf.indexOf("\n")) >= 0) {
338
- const line = buf.slice(0, nl);
339
- buf = buf.slice(nl + 1);
340
- if (line.length > 0) {
341
- try {
342
- opts.onLine(line);
343
- }
344
- catch { /* swallow listener errors */ }
345
- }
346
- }
347
- });
348
- child.stderr.setEncoding("utf-8");
349
- child.stderr.on("data", (chunk) => {
350
- stderrTail += chunk;
351
- if (stderrTail.length > STDERR_TAIL_BYTES)
352
- stderrTail = stderrTail.slice(-STDERR_TAIL_BYTES);
353
- });
354
- child.on("error", (err) => {
355
- clearTimeout(timer);
356
- reject(new Error(`Smol command spawn failed: ${err.message}`));
357
- });
358
- child.on("close", (code) => {
359
- clearTimeout(timer);
360
- if (buf.length > 0 && opts?.onLine) {
361
- try {
362
- opts.onLine(buf);
363
- }
364
- catch { /* ignore */ }
365
- }
366
- resolvePromise({
367
- exitCode: timedOut ? 124 : (code ?? 1),
368
- stdout: stdoutTail,
369
- stderr: stderrTail,
370
- timedOut,
371
- });
372
- });
373
- });
374
- }
375
- /** Stop + delete the machine. */
376
- async destroy(taskId) {
377
- const info = this.machines.get(taskId);
378
- if (!info)
379
- return;
380
- execSafe(smolBin(), ["machine", "stop", "--name", info.machineName]);
381
- execSafe(smolBin(), ["machine", "delete", "-f", "--name", info.machineName]);
382
- this.machines.delete(taskId);
383
- console.log(`[smol] Destroyed: ${info.machineName}`);
384
- }
385
- /**
386
- * The allowlist hosts that smolvm can actually use, in original order.
387
- *
388
- * smolvm resolves every `--allow-host` to its IP(s) AT VM START and aborts
389
- * `create` if ANY entry fails to resolve. Our `egress-allowlist.ts` follows an
390
- * apex+subdomain convention (e.g. `githubusercontent.com`), and some of those
391
- * bare apexes have no A record — they'd abort the whole VM. So we pre-resolve
392
- * here and drop the unresolvable ones.
393
- *
394
- * CAVEAT: unlike docker (SNI) / gondolin (hostname), smolvm's filter is
395
- * IP-pinned at start — `--allow-host github.com` allows github.com's IPs only,
396
- * NOT api.github.com or rotating CDN IPs. A faithful apex+subdomain policy
397
- * would need each concrete subdomain enumerated; that's a spike gap.
398
- */
399
- async resolvableAllowHosts() {
400
- if (!this.config.allowHosts)
401
- return [];
402
- const ok = new Set();
403
- const dropped = [];
404
- await Promise.all(this.config.allowHosts.map(async (h) => {
405
- if (!HOST_RE.test(h))
406
- throw new Error(`Refusing to pass allow-host "${h}" — bad charset`);
407
- try {
408
- await lookup(h);
409
- ok.add(h);
410
- }
411
- catch {
412
- dropped.push(h);
413
- }
414
- }));
415
- if (dropped.length) {
416
- console.warn(`[smol] Dropping unresolvable allow-host entries (smolvm resolves each at VM start): ${dropped.join(", ")}`);
417
- }
418
- return this.config.allowHosts.filter((h) => ok.has(h));
419
- }
420
- /**
421
- * Build `--secret-env GUEST=GUEST` flags for every machine-env var plus the
422
- * child-process env that carries their values, so secrets (tokens, provider
423
- * keys) reach the guest via smolvm's secret channel rather than the argv.
424
- */
425
- secretEnv() {
426
- const flags = [];
427
- const childEnv = { ...process.env };
428
- for (const [k, v] of Object.entries(this.config.env)) {
429
- if (!ENV_KEY_RE.test(k) || /[\n\r]/.test(v))
430
- continue;
431
- flags.push("--secret-env", `${k}=${k}`);
432
- childEnv[k] = v;
433
- }
434
- return { flags, childEnv };
435
- }
436
- }
437
- /** Strip a taskId down to the charset smolvm accepts in a machine name. */
438
- function sanitizeName(taskId) {
439
- return taskId.replace(/[^A-Za-z0-9_-]/g, "-").slice(0, 48);
440
- }
441
- /**
442
- * Depth-limited search for a file named `name` under `root`, returning its
443
- * absolute path (or null). Used to locate the mount-probe sentinel; the share
444
- * lands at most a couple of levels deep, so a shallow walk suffices and avoids
445
- * descending into a large checkout.
446
- */
447
- function findFileUnder(root, name, maxDepth) {
448
- if (!existsSync(root))
449
- return null;
450
- let entries;
451
- try {
452
- entries = readdirSync(root, { withFileTypes: true });
453
- }
454
- catch {
455
- return null;
456
- }
457
- for (const e of entries) {
458
- if (e.isFile() && e.name === name)
459
- return join(root, name);
460
- }
461
- if (maxDepth <= 0)
462
- return null;
463
- for (const e of entries) {
464
- if (e.isDirectory()) {
465
- const hit = findFileUnder(join(root, e.name), name, maxDepth - 1);
466
- if (hit)
467
- return hit;
468
- }
469
- }
470
- return null;
471
- }
472
- function execCmd(cmd, args, opts) {
473
- return execFileSync(cmd, args, {
474
- encoding: "utf-8",
475
- stdio: ["pipe", "pipe", "pipe"],
476
- timeout: opts?.timeout,
477
- });
478
- }
479
- function execSafe(cmd, args) {
480
- try {
481
- execFileSync(cmd, args, { stdio: "ignore" });
482
- }
483
- catch { /* ignore */ }
484
- }
485
- //# sourceMappingURL=smol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smol.js","sourceRoot":"","sources":["../../src/sandbox/smol.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- export declare const CHAT_PROJECT_SLUG = "-app";
2
- export type SessionLogScope = "sandbox" | "chat";
3
- /** Normalized message shape returned by session-log readers. */
4
- export interface JsonlMessage {
5
- role: string;
6
- content?: unknown;
7
- tool_calls?: unknown;
8
- tool_name?: string;
9
- tool_call_id?: string;
10
- timestamp?: string;
11
- reasoning?: unknown;
12
- finish_reason?: string;
13
- [k: string]: unknown;
14
- }
15
- export interface SessionLogRef {
16
- projectSlug: string;
17
- sessionId: string;
18
- }
19
- export interface SessionLogEntry {
20
- id: string;
21
- filePath: string;
22
- mtimeMs: number;
23
- projectSlug: string;
24
- }
25
- export interface NormalizedLogRecord {
26
- timestamp: string;
27
- msg: JsonlMessage;
28
- raw: Record<string, unknown>;
29
- }
30
- /**
31
- * Filesystem cwd → project-dir slug (matches the SDK convention). The
32
- * absolute path with `/` replaced by `-`. `/app` → `-app`,
33
- * `/home/agent/workspace` → `-home-agent-workspace`.
34
- */
35
- export declare function projectSlugForCwd(cwd: string): string;
36
- export declare class SessionLog {
37
- private homeDir;
38
- constructor(homeDir: string);
39
- normalizeSessionId(sessionId: string): string | null;
40
- pathForProject(projectSlug: string, sessionId: string, opts?: {
41
- requireExists?: boolean;
42
- }): string | null;
43
- findSession(scope: SessionLogScope, sessionId: string): SessionLogEntry | null;
44
- listSessions(scope: SessionLogScope): SessionLogEntry[];
45
- relatedFilesForSession(scope: SessionLogScope, sessionId: string, opts?: {
46
- includeAgents?: boolean;
47
- }): string[];
48
- appendEnvelopeLines(ref: SessionLogRef, lines: object[]): Promise<void>;
49
- readNormalizedFile(filePath: string, opts?: {
50
- skipEmptySystem?: boolean;
51
- }): Promise<NormalizedLogRecord[]>;
52
- readNormalizedSession(scope: SessionLogScope, sessionId: string, opts?: {
53
- includeAgents?: boolean;
54
- skipEmptySystem?: boolean;
55
- }): Promise<Array<{
56
- index: number;
57
- msg: JsonlMessage;
58
- }>>;
59
- normalizeLine(raw: Record<string, unknown>): JsonlMessage[];
60
- private isSafeProjectSlug;
61
- private projectDirs;
62
- private mtimeMs;
63
- }