lastlight 0.16.0 → 0.16.1

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} +26 -1
  5. package/dist/{cli/cli-server.js → cli-server.js} +40 -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} +4 -3
  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
package/dist/providers.js DELETED
@@ -1,279 +0,0 @@
1
- /**
2
- * Provider registry — single source of truth for the LLM providers Last Light
3
- * knows how to wire end-to-end.
4
- *
5
- * pi-ai (`@earendil-works/pi-ai`) is provider-agnostic and supports 15+
6
- * providers out of the box. Of those, only a subset is "wizard-able" here:
7
- * they authenticate with a single API-key env var and expose a stable
8
- * endpoint reachable from the sandbox egress firewall. Excluded are the
9
- * OAuth-only providers (`openai-codex`, `github-copilot`), the multi-env
10
- * Ambient-cred ones (`amazon-bedrock`, `google-vertex`, `azure-openai-*`,
11
- * `cloudflare-*`), and the regional-CN variants.
12
- *
13
- * This registry is consumed by:
14
- * - `src/engine/llm.ts` — the cheap one-shot helper used by the
15
- * prompt screener + intent classifier. It builds requests for the
16
- * `openai-completions` family (which is most wizard-able providers —
17
- * Google and Mistral are routed through their OpenAI-compatible
18
- * endpoints) and the `anthropic-messages` family (Kimi for Coding,
19
- * MiniMax, Anthropic itself).
20
- * - `src/engine/agent-executor.ts` — forwards each provider's env var
21
- * into the sandbox so agentic-pi can auth.
22
- * - `src/sandbox/egress-allowlist.ts` — the SNI/firewall allowlist is
23
- * seeded from each provider's `host`.
24
- * - `src/cli/setup.ts` — the install wizard's step-4 provider picker.
25
- *
26
- * Keep this list aligned with pi-ai's provider registry. When pi-ai adds a
27
- * new provider that we want to surface, add an entry here and everything
28
- * else (forwarding, egress, wizard UI) follows automatically.
29
- */
30
- /**
31
- * The registry. Order matters — `defaultFastModel()` in `llm.ts` selects
32
- * a fast model by iterating this list and picking the first provider
33
- * whose env var is present. Always keep Anthropic first (best raw-latency
34
- * cheap helper) then OpenAI then OpenRouter, then the rest grouped by
35
- * families so the array is easy to scan.
36
- */
37
- export const PROVIDERS = [
38
- // ── Anthropic-messages family ───────────────────────────────────────
39
- {
40
- prefix: "anthropic",
41
- displayName: "Anthropic",
42
- envKey: "ANTHROPIC_API_KEY",
43
- baseUrl: "https://api.anthropic.com/v1",
44
- api: "anthropic-messages",
45
- host: "anthropic.com",
46
- fastModel: "claude-haiku-4-5-20251001",
47
- sampleModel: "claude-sonnet-4-6",
48
- keyPrefix: "sk-ant-",
49
- },
50
- {
51
- prefix: "kimi-coding",
52
- displayName: "Kimi for Coding (Moonshot)",
53
- envKey: "KIMI_API_KEY",
54
- baseUrl: "https://api.kimi.com/coding",
55
- api: "anthropic-messages",
56
- host: "kimi.com",
57
- fastModel: "kimi-latest",
58
- sampleModel: "kimi-latest",
59
- },
60
- {
61
- prefix: "minimax",
62
- displayName: "MiniMax",
63
- envKey: "MINIMAX_API_KEY",
64
- baseUrl: "https://api.minimax.io/anthropic",
65
- api: "anthropic-messages",
66
- host: "minimax.io",
67
- fastModel: "MiniMax-M1",
68
- sampleModel: "MiniMax-M2",
69
- },
70
- // ── OpenAI-completions family — first-party OpenAI ──────────────────
71
- {
72
- prefix: "openai",
73
- displayName: "OpenAI",
74
- envKey: "OPENAI_API_KEY",
75
- baseUrl: "https://api.openai.com/v1",
76
- api: "openai-completions",
77
- host: "openai.com",
78
- fastModel: "gpt-5.4-mini",
79
- sampleModel: "gpt-5.5",
80
- maxTokensField: "max_completion_tokens",
81
- keyPrefix: "sk-",
82
- },
83
- // ── Google Gemini — routed through Google's OpenAI-compatible endpoint ──
84
- {
85
- prefix: "google",
86
- displayName: "Google AI Studio (Gemini)",
87
- envKey: "GEMINI_API_KEY",
88
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
89
- api: "openai-completions",
90
- host: "generativelanguage.googleapis.com",
91
- fastModel: "gemini-2.5-flash",
92
- sampleModel: "gemini-2.5-pro",
93
- keyPrefix: "AIza",
94
- },
95
- // ── Mistral — Mistral exposes an OpenAI-compatible path ──────────────
96
- {
97
- prefix: "mistral",
98
- displayName: "Mistral",
99
- envKey: "MISTRAL_API_KEY",
100
- baseUrl: "https://api.mistral.ai/v1",
101
- api: "openai-completions",
102
- host: "mistral.ai",
103
- fastModel: "mistral-small-latest",
104
- sampleModel: "mistral-large-latest",
105
- },
106
- // ── OpenAI-compatible inference specialists ──────────────────────────
107
- {
108
- prefix: "groq",
109
- displayName: "Groq",
110
- envKey: "GROQ_API_KEY",
111
- baseUrl: "https://api.groq.com/openai/v1",
112
- api: "openai-completions",
113
- host: "groq.com",
114
- fastModel: "llama-3.3-70b-versatile",
115
- sampleModel: "llama-3.3-70b-versatile",
116
- },
117
- {
118
- prefix: "cerebras",
119
- displayName: "Cerebras",
120
- envKey: "CEREBRAS_API_KEY",
121
- baseUrl: "https://api.cerebras.ai/v1",
122
- api: "openai-completions",
123
- host: "cerebras.ai",
124
- fastModel: "llama-3.3-70b",
125
- sampleModel: "llama-3.3-70b",
126
- },
127
- {
128
- prefix: "xai",
129
- displayName: "xAI (Grok)",
130
- envKey: "XAI_API_KEY",
131
- baseUrl: "https://api.x.ai/v1",
132
- api: "openai-completions",
133
- host: "x.ai",
134
- fastModel: "grok-3-mini",
135
- sampleModel: "grok-4",
136
- },
137
- {
138
- prefix: "huggingface",
139
- displayName: "Hugging Face",
140
- envKey: "HF_TOKEN",
141
- baseUrl: "https://router.huggingface.co/v1",
142
- api: "openai-completions",
143
- host: "huggingface.co",
144
- fastModel: "meta-llama/Llama-3.3-70B-Instruct",
145
- sampleModel: "meta-llama/Llama-3.3-70B-Instruct",
146
- keyPrefix: "hf_",
147
- },
148
- {
149
- prefix: "moonshotai",
150
- displayName: "Moonshot AI",
151
- envKey: "MOONSHOT_API_KEY",
152
- baseUrl: "https://api.moonshot.ai/v1",
153
- api: "openai-completions",
154
- host: "moonshot.ai",
155
- fastModel: "kimi-k2",
156
- sampleModel: "kimi-k2",
157
- },
158
- {
159
- prefix: "nvidia",
160
- displayName: "NVIDIA NIM",
161
- envKey: "NVIDIA_API_KEY",
162
- baseUrl: "https://integrate.api.nvidia.com/v1",
163
- api: "openai-completions",
164
- host: "integrate.api.nvidia.com",
165
- fastModel: "meta/llama-3.3-70b-instruct",
166
- sampleModel: "meta/llama-3.3-70b-instruct",
167
- },
168
- {
169
- prefix: "fireworks",
170
- displayName: "Fireworks",
171
- envKey: "FIREWORKS_API_KEY",
172
- baseUrl: "https://api.fireworks.ai/inference/v1",
173
- api: "openai-completions",
174
- host: "fireworks.ai",
175
- fastModel: "accounts/fireworks/models/llama-v3p3-70b-instruct",
176
- sampleModel: "accounts/fireworks/models/llama-v3p3-70b-instruct",
177
- },
178
- {
179
- prefix: "together",
180
- displayName: "Together",
181
- envKey: "TOGETHER_API_KEY",
182
- baseUrl: "https://api.together.ai/v1",
183
- api: "openai-completions",
184
- host: "together.ai",
185
- fastModel: "meta-llama/Llama-3.3-70B-Instruct-Turbo",
186
- sampleModel: "meta-llama/Llama-3.3-70B-Instruct-Turbo",
187
- },
188
- {
189
- prefix: "deepseek",
190
- displayName: "DeepSeek",
191
- envKey: "DEEPSEEK_API_KEY",
192
- baseUrl: "https://api.deepseek.com/v1",
193
- api: "openai-completions",
194
- host: "deepseek.com",
195
- fastModel: "deepseek-chat",
196
- sampleModel: "deepseek-chat",
197
- },
198
- {
199
- prefix: "zai",
200
- displayName: "Z.AI (GLM)",
201
- envKey: "ZAI_API_KEY",
202
- baseUrl: "https://api.z.ai/api/coding/paas/v4",
203
- api: "openai-completions",
204
- host: "z.ai",
205
- fastModel: "glm-4.6",
206
- sampleModel: "glm-4.6",
207
- },
208
- // ── OpenRouter — aggregator (take any pi.dev-listed model via one key) ──
209
- {
210
- prefix: "openrouter",
211
- displayName: "OpenRouter (aggregator — Anthropic, Google, xAI, …)",
212
- envKey: "OPENROUTER_API_KEY",
213
- baseUrl: "https://openrouter.ai/api/v1",
214
- api: "openai-completions",
215
- host: "openrouter.ai",
216
- fastModel: "google/gemini-2.5-flash",
217
- sampleModel: "anthropic/claude-sonnet-4.5",
218
- preserveNestedModelId: true,
219
- extraHeaders: {
220
- "HTTP-Referer": "https://github.com/nearform/lastlight",
221
- "X-Title": "Last Light",
222
- },
223
- keyPrefix: "sk-or-",
224
- },
225
- ];
226
- const PREFIX_INDEX = new Map(PROVIDERS.map((p) => [p.prefix, p]));
227
- const ENV_INDEX = new Map(PROVIDERS.map((p) => [p.envKey, p]));
228
- export function providerByPrefix(prefix) {
229
- return PREFIX_INDEX.get(prefix.toLowerCase());
230
- }
231
- export function providerByEnvKey(envKey) {
232
- return ENV_INDEX.get(envKey);
233
- }
234
- /** All the env var names a harness must forward to reach every registered provider. */
235
- export const PROVIDER_ENV_KEYS = PROVIDERS.map((p) => p.envKey);
236
- /** All the hosts the sandbox egress firewall must allowlist to reach these providers. */
237
- export const PROVIDER_HOSTS = PROVIDERS.map((p) => p.host);
238
- /**
239
- * Default model spec shipped with the harness. Keep aligned with the
240
- * `OPENCODE_MODEL` default in `config/default.yaml` and the wizard's
241
- * initial provider selection.
242
- */
243
- export const DEFAULT_PROVIDER = "anthropic";
244
- export const DEFAULT_MODEL = "anthropic/claude-sonnet-4-6";
245
- export const OAUTH_PROVIDERS = [
246
- {
247
- id: "openai-codex",
248
- displayName: "ChatGPT Plus/Pro (Codex)",
249
- modelPrefix: "openai-codex",
250
- sampleModel: "openai-codex/gpt-5.4",
251
- sandboxEnvVar: null, // chatgpt.com backend — no env route, chat-only
252
- oauthOnly: true,
253
- },
254
- {
255
- id: "anthropic",
256
- displayName: "Anthropic (Claude Pro/Max)",
257
- modelPrefix: "anthropic",
258
- sampleModel: "anthropic/claude-sonnet-4-6",
259
- sandboxEnvVar: "ANTHROPIC_OAUTH_TOKEN",
260
- oauthOnly: false, // falls back to ANTHROPIC_API_KEY
261
- },
262
- {
263
- id: "github-copilot",
264
- displayName: "GitHub Copilot",
265
- modelPrefix: "github-copilot",
266
- sampleModel: "github-copilot/gpt-4o",
267
- sandboxEnvVar: "COPILOT_GITHUB_TOKEN",
268
- oauthOnly: true,
269
- },
270
- ];
271
- const OAUTH_PREFIX_INDEX = new Map(OAUTH_PROVIDERS.map((p) => [p.modelPrefix, p]));
272
- const OAUTH_ID_INDEX = new Map(OAUTH_PROVIDERS.map((p) => [p.id, p]));
273
- export function oauthProviderByModelPrefix(prefix) {
274
- return OAUTH_PREFIX_INDEX.get(prefix);
275
- }
276
- export function oauthProviderById(id) {
277
- return OAUTH_ID_INDEX.get(id);
278
- }
279
- //# sourceMappingURL=providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
@@ -1,180 +0,0 @@
1
- /**
2
- * Docker sandbox manager — runs agent tasks in isolated sibling containers.
3
- *
4
- * The sandbox image bakes immutable assets at /app/ (skills, agent-context,
5
- * MCP server, MCP config template). Its entrypoint wires them into the
6
- * workspace after volumes are mounted — no post-run docker exec needed.
7
- *
8
- * Volumes mounted at runtime:
9
- * - Shared data volume (/data): secrets (app.pem), session logs
10
- * - Task worktree (/home/agent/workspace): per-task git repo
11
- */
12
- export interface SandboxConfig {
13
- /** Docker image for sandbox containers (default: lastlight-sandbox:latest) */
14
- imageName: string;
15
- /** Env vars to inject into the sandbox */
16
- env: Record<string, string>;
17
- /** Timeout in seconds (default: 1800 = 30 min) */
18
- timeoutSeconds?: number;
19
- /**
20
- * Per-sandbox memory cap, in Docker's `--memory` format (e.g. "2g", "512m").
21
- * Default: 2g — enough headroom for `npm install`, vite build, and an
22
- * agent loop, but small enough that several concurrent sandboxes can't
23
- * exhaust a 16 GB host. Override via the `SANDBOX_MEMORY_LIMIT` env var.
24
- */
25
- memoryLimit?: string;
26
- /**
27
- * Docker network to attach the sandbox container to. Defaults to
28
- * `LASTLIGHT_SANDBOX_NETWORK` env var or `lastlight_sandbox-egress`
29
- * (the `internal: true` network declared in docker-compose.yml). The
30
- * sandbox can only reach the public internet through the nginx-egress
31
- * firewall sidecars on this network.
32
- */
33
- network?: string;
34
- /**
35
- * IP of the coredns sidecar this sandbox uses as its DNS resolver.
36
- * `coredns-strict` (172.30.0.10) returns the strict-nginx IP for
37
- * allowlisted hosts and NXDOMAIN for everything else; `coredns-open`
38
- * (172.30.0.11) returns the open-nginx IP for any hostname (minus a
39
- * small SSRF deny set). Passed to `docker run` as `--dns <ip>`.
40
- *
41
- * No env vars are injected — the sandbox has no idea a firewall is
42
- * in front of it. Works for every SDK regardless of whether it
43
- * honours HTTP_PROXY / HTTPS_PROXY.
44
- */
45
- dnsIp?: string;
46
- }
47
- export interface SandboxInfo {
48
- containerId: string;
49
- containerName: string;
50
- worktreePath: string;
51
- }
52
- /**
53
- * How `/home/agent/workspace` is materialized inside the sandbox container.
54
- *
55
- * - `bind`: classic host-path bind mount. Only safe when the host filesystem
56
- * path is identical from the harness's view and the docker daemon's view —
57
- * i.e. local dev where the harness runs directly on the host, or any
58
- * deployment where `SANDBOX_DATA_VOLUME` is a real host path.
59
- * - `volume-subpath`: mount a subpath of a named docker volume. Required
60
- * when the harness runs inside a container that holds the data dir via a
61
- * named volume (the standard docker-compose setup). A bare bind would
62
- * resolve `/app/data/sandboxes/<id>` against the host's empty bare-FS
63
- * `/app/data/...` rather than the named volume's `_data/sandboxes/<id>`,
64
- * producing two divergent trees and breaking skill staging.
65
- */
66
- export type WorkspaceMount = {
67
- type: "bind";
68
- hostPath: string;
69
- } | {
70
- type: "volume-subpath";
71
- volume: string;
72
- subpath: string;
73
- };
74
- export declare class DockerSandbox {
75
- private config;
76
- private activeContainers;
77
- constructor(config: SandboxConfig);
78
- /**
79
- * Create and start a sandbox container for a task.
80
- */
81
- create(opts: {
82
- taskId: string;
83
- worktreePath: string;
84
- workspaceMount: WorkspaceMount;
85
- }): Promise<SandboxInfo>;
86
- /**
87
- * Wait for the sandbox entrypoint to finish setup. The entrypoint touches
88
- * `$WORKSPACE/.ready` as its last step before exec'ing the agent shell.
89
- */
90
- private waitForReady;
91
- /**
92
- * Run the agentic-pi CLI inside the sandbox with a prompt.
93
- *
94
- * Streams stdout line-by-line so the caller can react to JSON events
95
- * (e.g. capture the top-level `session` record's id) before the agent
96
- * has finished. The full stdout is also buffered and returned for
97
- * post-run parsing of the usage_snapshot rollup.
98
- */
99
- runAgent(taskId: string, prompt: string, opts?: {
100
- model?: string;
101
- /**
102
- * Pi thinking level: `off | minimal | low | medium | high | xhigh`.
103
- * Validated against the closed set before being shell-interpolated.
104
- */
105
- thinking?: string;
106
- /** agentic-pi GitHub profile: `read | issues-write | review-write | repo-write`. */
107
- profile?: string;
108
- /**
109
- * Env forwarded INTO the sandboxed run via repeated `--sandbox-env`
110
- * flags. Used to inject git identity. Keys / values are charset-asserted
111
- * before shell interpolation.
112
- */
113
- sandboxEnv?: Record<string, string>;
114
- /**
115
- * Working directory for the agent process inside the container.
116
- * Defaults to WORKSPACE_DIR (the workspace root). When the harness
117
- * pre-cloned the target repo, the executor passes
118
- * `<WORKSPACE_DIR>/<repo>` so the agent starts inside the checked-out
119
- * tree. The path is asserted against an allowlist before being passed
120
- * to `docker exec -w` to keep it shell-safe.
121
- */
122
- agentCwd?: string;
123
- /**
124
- * Enable agentic-pi's web-search extension. When false (or omitted),
125
- * `--no-web-search` is appended to suppress auto-enable. When true,
126
- * the flag is omitted and agentic-pi auto-detects the provider from
127
- * whichever `*_API_KEY` env var the container received.
128
- */
129
- webSearch?: boolean;
130
- /** Force a specific web-search provider. Validated against a closed set. */
131
- webSearchProvider?: "tavily" | "brave" | "exa";
132
- /**
133
- * Per-phase skill directories to load, as absolute in-container paths
134
- * under WORKSPACE_DIR (e.g. `/home/agent/workspace/.lastlight-skills/
135
- * <phase>/<skill>`). Each becomes a repeated `--skill <dir>` flag.
136
- * Charset/prefix-asserted before shell interpolation.
137
- */
138
- skillDirs?: string[];
139
- /** Called for each newline-terminated stdout line as it arrives. */
140
- onLine?: (line: string) => void;
141
- }): Promise<void>;
142
- /**
143
- * Run a deterministic shell command inside an already-provisioned sandbox
144
- * container and return its exit code + captured output. This is the
145
- * non-agent sibling of {@link runAgent}: same `docker exec --user agent -w
146
- * <workdir> … sh -c <cmd>` machinery, but it captures a bounded stdout tail
147
- * (runAgent discards stdout) and RESOLVES with the exit code instead of
148
- * rejecting on non-zero — the caller decides success/failure.
149
- *
150
- * Powers `type: bash` / `type: script` workflow phases (and the in-sandbox
151
- * `generic_loop.until_bash` check). `command` is passed as a single argv slot
152
- * to `sh -c`, so it is NOT re-parsed by the host shell — it is the script we
153
- * intend to run. Env is forwarded via `docker exec -e KEY=VALUE` (argv, not
154
- * shell-interpolated); keys are charset-asserted defensively.
155
- */
156
- runCommand(taskId: string, command: string, opts?: {
157
- /**
158
- * Working directory inside the container. Defaults to WORKSPACE_DIR.
159
- * Asserted against the workspace-root allowlist (same guard as runAgent).
160
- */
161
- cwd?: string;
162
- /** Env forwarded into the command via `docker exec -e`. */
163
- sandboxEnv?: Record<string, string>;
164
- /** Per-command timeout in seconds (default: the sandbox config timeout). */
165
- timeoutSeconds?: number;
166
- /** Called for each newline-terminated stdout line as it arrives. */
167
- onLine?: (line: string) => void;
168
- }): Promise<{
169
- exitCode: number;
170
- stdout: string;
171
- stderr: string;
172
- timedOut: boolean;
173
- }>;
174
- /**
175
- * Remove a sandbox container.
176
- */
177
- destroy(taskId: string): Promise<void>;
178
- destroyAll(): Promise<void>;
179
- private resolveGitMounts;
180
- }