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,164 +0,0 @@
1
- import { isIP } from "node:net";
2
- import { PROVIDER_HOSTS as REGISTRY_PROVIDER_HOSTS } from "../providers.js";
3
- /**
4
- * Single source of truth for sandbox HTTP egress allowlists.
5
- *
6
- * Both sandbox backends consume this list:
7
- * - gondolin: passed verbatim to `agenticRun({ allowedHttpHosts })` so the
8
- * QEMU-layer HTTP interceptor 502s anything off-list.
9
- * - docker: nginx-egress + coredns configs are generated from these hosts
10
- * at harness boot. Sandbox containers spawn with `--dns <coredns-ip>`;
11
- * coredns sinkholes allowlisted hostnames to the nginx firewall IP,
12
- * which peeks SNI and tunnels to the real upstream. See
13
- * `src/sandbox/egress-firewall-config.ts` for the full architecture.
14
- *
15
- * The lists are intentionally split so callers can compose tighter policies
16
- * (e.g. a read-only profile that doesn't need package registries). The
17
- * everyday default is `DEFAULT_ALLOWLIST`.
18
- *
19
- * ## Convention: every entry matches the apex AND all subdomains
20
- *
21
- * `openai.com` → matches openai.com, api.openai.com, platform.openai.com, …
22
- * `npmjs.org` → matches npmjs.org, registry.npmjs.org, auth.npmjs.org, …
23
- *
24
- * Bare hostnames only — no leading dot, no `*.` prefix. The config
25
- * generator emits the right syntax for each backend (nginx's
26
- * `.example.com` map form, CoreDNS regex `(^|\.)example\.com\.$`).
27
- *
28
- * Exact-only matching isn't currently supported because we haven't
29
- * needed it — every host in the list is one we want apex+subdomain
30
- * access to. If we ever do, we'd add an explicit type (e.g. an `exact:`
31
- * prefix) so the loose-by-default convention stays unambiguous.
32
- *
33
- * A workflow phase can declare `unrestricted_egress: true` to bypass the
34
- * allowlist entirely — see `src/workflows` for the phase schema.
35
- */
36
- /** GitHub HTTPS endpoints used by `git`, `gh`, and agentic-pi's github tools. */
37
- export const GITHUB_HOSTS = [
38
- // Covers github.com plus api.github.com, codeload.github.com, raw.…, gist.…
39
- "github.com",
40
- // *.githubusercontent.com — release artifacts, raw blobs, avatars.
41
- "githubusercontent.com",
42
- ];
43
- /**
44
- * LLM provider hosts.
45
- *
46
- * Required for the docker backend because `agentic-pi run` executes inside
47
- * the sandbox container there (`src/sandbox/docker.ts` runs `agentic-pi run
48
- * --sandbox none`), so the LLM HTTP call originates from inside the
49
- * container. The gondolin backend runs agentic-pi in the harness process,
50
- * so the call originates from the host and these hosts aren't strictly
51
- * required inside the VM — they're kept here so a single allowlist can
52
- * cover both paths without surprises.
53
- *
54
- * The list is derived from the provider registry (`src/providers.ts`) —
55
- * every wizard-able provider has a `host` entry there, so adding a new
56
- * provider automatically seeds this allowlist. Each entry matches the
57
- * apex AND all subdomains (see `normalizeAllowlistHost`).
58
- */
59
- export const PROVIDER_HOSTS = REGISTRY_PROVIDER_HOSTS;
60
- /**
61
- * Public package registries the executor may hit during `npm install`,
62
- * etc. Apex-plus-subdomain matching covers auth / CDN / mirror
63
- * subdomains without needing separate entries.
64
- */
65
- export const PACKAGE_REGISTRY_HOSTS = [
66
- // npm / yarn / pnpm
67
- "npmjs.org",
68
- "yarnpkg.com",
69
- // Python — pypi.org + files.pythonhosted.org are the two big ones.
70
- "pypi.org",
71
- "pythonhosted.org",
72
- // Rust — static.crates.io, index.crates.io, crates.io itself.
73
- "crates.io",
74
- // Go modules — covers proxy.golang.org, sum.golang.org, plus golang.org.
75
- "golang.org",
76
- // Ruby
77
- "rubygems.org",
78
- // Alpine apk + Debian apt — apex covers the regional mirror subdomains.
79
- "alpinelinux.org",
80
- "debian.org",
81
- ];
82
- /**
83
- * Combined allowlist used by both backends when a phase has not opted into
84
- * unrestricted egress. Order is preserved across imports so generated
85
- * configs are stable.
86
- */
87
- export const DEFAULT_ALLOWLIST = [
88
- ...GITHUB_HOSTS,
89
- ...PROVIDER_HOSTS,
90
- ...PACKAGE_REGISTRY_HOSTS,
91
- ];
92
- /**
93
- * Sentinel value recognized by agentic-pi/gondolin (post the `"*"` patch)
94
- * meaning "allow every host". Used when a phase sets `unrestricted_egress`.
95
- *
96
- * On the docker backend, unrestricted egress routes through the open
97
- * nginx-egress + coredns-open pair — this sentinel is for gondolin only.
98
- */
99
- export const ALLOW_ALL_SENTINEL = "*";
100
- const INTERNAL_HOSTNAMES = new Set(["localhost", "metadata.google.internal"]);
101
- function isPrivateOrInternalIp(host) {
102
- const ip = host.replace(/^\[|\]$/g, "");
103
- const family = isIP(ip);
104
- if (family === 4) {
105
- const octets = ip.split(".").map((part) => Number(part));
106
- if (octets.length !== 4 || octets.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
107
- return true;
108
- const [a, b] = octets;
109
- return a === 0
110
- || a === 10
111
- || a === 127
112
- || (a === 169 && b === 254)
113
- || (a === 172 && b >= 16 && b <= 31)
114
- || (a === 192 && b === 168);
115
- }
116
- if (family === 6) {
117
- const lower = ip.toLowerCase();
118
- const mappedIpv4 = lower.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/)?.[1];
119
- if (mappedIpv4)
120
- return isPrivateOrInternalIp(mappedIpv4);
121
- if (lower.startsWith("::ffff:"))
122
- return true;
123
- return lower === "::"
124
- || lower === "::1"
125
- || lower.startsWith("fe8")
126
- || lower.startsWith("fe9")
127
- || lower.startsWith("fea")
128
- || lower.startsWith("feb")
129
- || lower.startsWith("fc")
130
- || lower.startsWith("fd");
131
- }
132
- return false;
133
- }
134
- export function normalizeAllowlistHost(host) {
135
- const trimmed = host.trim().toLowerCase();
136
- if (!trimmed)
137
- return null;
138
- let parsed = trimmed;
139
- try {
140
- parsed = new URL(trimmed.includes("://") ? trimmed : `https://${trimmed}`).hostname.toLowerCase();
141
- }
142
- catch {
143
- parsed = trimmed.split("/")[0] || "";
144
- if (!parsed.startsWith("["))
145
- parsed = parsed.split(":")[0] || "";
146
- }
147
- parsed = parsed.replace(/^\.+|\.+$/g, "").replace(/^\[|\]$/g, "");
148
- if (!parsed || parsed.includes("*") || INTERNAL_HOSTNAMES.has(parsed) || isPrivateOrInternalIp(parsed))
149
- return null;
150
- return parsed;
151
- }
152
- export function mergeAllowlist(base, extra = []) {
153
- const out = [];
154
- const seen = new Set();
155
- for (const candidate of [...base, ...extra]) {
156
- const host = normalizeAllowlistHost(candidate);
157
- if (host && !seen.has(host)) {
158
- seen.add(host);
159
- out.push(host);
160
- }
161
- }
162
- return out;
163
- }
164
- //# sourceMappingURL=egress-allowlist.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"egress-allowlist.js","sourceRoot":"","sources":["../../src/sandbox/egress-allowlist.ts"],"names":[],"mappings":"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"}
@@ -1,127 +0,0 @@
1
- /**
2
- * Egress firewall config generation for the docker sandbox backend.
3
- *
4
- * Architecture (replaces the earlier tinyproxy CONNECT-proxy):
5
- *
6
- * sandbox-egress (internal: true, subnet 172.30.0.0/24)
7
- * ├─ sandbox containers (docker run --dns <coredns-ip>)
8
- * ├─ coredns-strict 172.30.0.10 → returns nginx-strict IP for allowlist hosts, NXDOMAIN otherwise
9
- * ├─ coredns-open 172.30.0.11 → returns nginx-open IP for ANY hostname (except hard-deny SSRF magnets)
10
- * ├─ nginx-egress-strict 172.30.0.20 → ssl_preread, SNI must match allowlist; tunnel upstream via proxy-egress
11
- * └─ nginx-egress-open 172.30.0.21 → tunnel any SNI; client DNS already gated through coredns-open
12
- *
13
- * Why this instead of a forward proxy (tinyproxy/smokescreen): clients
14
- * inside the sandbox (especially the OpenAI/Anthropic SDKs that build
15
- * their own undici dispatchers) don't honour HTTP_PROXY / HTTPS_PROXY.
16
- * Forcing them to cooperate is a losing battle. By spoofing DNS and
17
- * peeking SNI at the network layer, the sandbox sees no proxy at all —
18
- * it dials `api.openai.com:443` directly. The firewall intercepts the
19
- * connection by virtue of being the only thing the spoofed DNS pointed
20
- * at.
21
- *
22
- * Inspired by Vercel Sandbox's egress firewall (SNI peeking, no env
23
- * vars). Their implementation also handles TLS termination for
24
- * credentials brokering and Postgres STARTTLS — we don't (yet).
25
- *
26
- * ## Wildcards
27
- *
28
- * Entries in egress-allowlist.ts with a leading dot (`".github.com"`)
29
- * match the apex plus every subdomain. nginx's `map` directive supports
30
- * this syntax natively. CoreDNS uses the `template` plugin with an
31
- * anchored regex to do the same.
32
- */
33
- /** Fixed IPs assigned in docker-compose.yml so `--dns` and nginx upstreams can reference them. */
34
- export declare const COREDNS_STRICT_IP = "172.30.0.10";
35
- export declare const COREDNS_OPEN_IP = "172.30.0.11";
36
- export declare const NGINX_STRICT_IP = "172.30.0.20";
37
- export declare const NGINX_OPEN_IP = "172.30.0.21";
38
- /**
39
- * Static IP of the in-network OTEL collector (docker backend). Sandboxes
40
- * dial it directly by IP — it lives on `sandbox-egress` alongside the
41
- * firewalls, so no DNS lookup (and therefore no coredns allowlist entry)
42
- * is involved. The collector is the ONLY OTLP endpoint a sandbox ever
43
- * sees: it terminates the sandbox's telemetry and re-exports to the real
44
- * backend over `proxy-egress` using credentials that stay host-side. This
45
- * is why the strict SNI firewall no longer needs to know about collector
46
- * hosts or non-443 ports — that hop happens on the trusted outbound leg,
47
- * not through `ssl_preread`.
48
- */
49
- export declare const OTEL_COLLECTOR_IP = "172.30.0.30";
50
- /** OTLP/HTTP + OTLP/gRPC receiver ports the in-network collector listens on. */
51
- export declare const OTEL_COLLECTOR_OTLP_HTTP_PORT = 4318;
52
- export declare const OTEL_COLLECTOR_OTLP_GRPC_PORT = 4317;
53
- /** Endpoint a docker sandbox is told to export OTLP to (HTTP/protobuf). */
54
- export declare const OTEL_COLLECTOR_SANDBOX_ENDPOINT = "http://172.30.0.30:4318";
55
- /**
56
- * UID the `otel/opentelemetry-collector` image runs as (its Dockerfile
57
- * `USER`). The collector reads the OTLP config (which can hold backend auth
58
- * headers) as this non-root user. To let it read a mode-0600 file from the
59
- * shared volume WITHOUT running as root or making the secret world-readable,
60
- * the harness's own `lastlight` user is pinned to this same UID (see the
61
- * Dockerfile `useradd -u`), so the collector reads files it wrote as their
62
- * owner. The Dockerfile and the collector image tag in docker-compose.yml
63
- * must move together if a future image bumps the UID — enforced by a test in
64
- * docker-compose.test.ts.
65
- */
66
- export declare const OTEL_COLLECTOR_UID = 10001;
67
- /** Subnet for sandbox-egress. Compose declares this CIDR so the IPs above are valid. */
68
- export declare const SANDBOX_EGRESS_SUBNET = "172.30.0.0/24";
69
- /** Build the strict nginx.conf — ssl_preread + map on SNI allowlist. */
70
- export declare function renderNginxStrictConf(): string;
71
- /** Build the open nginx.conf — no SNI allowlist, just tunnel whatever DNS pointed at. */
72
- export declare function renderNginxOpenConf(): string;
73
- /** Build the Corefile that returns the strict nginx IP for allowlist hosts. */
74
- export declare function renderCorefileStrict(): string;
75
- /** Build the Corefile that returns the open nginx IP for ANY hostname (except hard-denies). */
76
- export declare function renderCorefileOpen(): string;
77
- /**
78
- * Write the four config files under $STATE_DIR/proxy/. Idempotent.
79
- * Returns the directory path. Compose bind-mounts this dir into the
80
- * coredns + nginx containers read-only.
81
- */
82
- export declare function writeEgressFirewallConfigs(stateDir: string): string;
83
- /**
84
- * Render the in-network OTEL collector config (docker backend).
85
- *
86
- * `opts.active` gates whether the collector forwards anywhere. It MUST track
87
- * the harness's effective `otel.enabled && otel.forwardToSandbox` — when
88
- * false, every pipeline is wired to a `debug` exporter (drops data) and NO
89
- * backend endpoint or credential is emitted, even if `OTEL_EXPORTER_OTLP_*`
90
- * env vars are present. This is the security floor: the collector listens on
91
- * a static IP that sandboxes can reach, so if forwarding weren't gated, a
92
- * sandbox could POST directly to it and exfil to the real backend regardless
93
- * of the documented `LASTLIGHT_OTEL_ENABLED` / `FORWARD_TO_SANDBOX` opt-outs.
94
- *
95
- * When active, the collector re-exports to the REAL backend — the standard
96
- * `OTEL_EXPORTER_OTLP_ENDPOINT` / `OTEL_EXPORTER_OTLP_HEADERS` plus their
97
- * per-signal `OTEL_EXPORTER_OTLP_<SIGNAL>_ENDPOINT` / `_HEADERS` overrides,
98
- * resolved with the spec's precedence. Each signal gets its own exporter so
99
- * a split traces/metrics/logs setup is routed correctly rather than all
100
- * collapsing onto whichever endpoint won a fallback chain. Those credentials
101
- * live here, in a file on the host mounted read-only into the collector, and
102
- * are NEVER forwarded into an untrusted sandbox. The sandbox can only
103
- * influence span *content* sent to the harness's own fixed backend — it
104
- * cannot redirect where the collector exports, so this adds no SSRF/exfil
105
- * surface.
106
- *
107
- * A signal with no configured endpoint (neither specific nor generic) is
108
- * likewise wired to `debug` so the collector still boots cleanly and accepts
109
- * connections — sandboxes simply never send what isn't routed.
110
- */
111
- export declare function renderOtelCollectorConfig(opts: {
112
- active: boolean;
113
- env?: NodeJS.ProcessEnv;
114
- }): string;
115
- /**
116
- * Write the in-network collector config to $STATE_DIR/proxy/otel-collector.yaml.
117
- * Mode 0600 — it can contain backend auth headers. Called at harness boot
118
- * (and by the compose `egress-init` one-shot) so the file exists before the
119
- * `otel-collector` service reads it. `opts.active` gates forwarding — see
120
- * `renderOtelCollectorConfig`. The harness passes its parsed
121
- * `otel.enabled && otel.forwardToSandbox`; the env-only callers compute it
122
- * via `otelForwardActiveFromEnv`.
123
- */
124
- export declare function writeOtelCollectorConfig(stateDir: string, opts: {
125
- active: boolean;
126
- env?: NodeJS.ProcessEnv;
127
- }): string;