lastlight 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/README.md +265 -118
  2. package/agent-context/rules.md +62 -9
  3. package/agent-context/security.md +69 -0
  4. package/config/default.yaml +89 -0
  5. package/deploy/.env.production.example +20 -2
  6. package/deploy/entrypoint.sh +16 -17
  7. package/deploy/native/README.md +160 -0
  8. package/deploy/native/install.sh +110 -0
  9. package/deploy/native/lastlight.env.example +95 -0
  10. package/deploy/native/lastlight.service +50 -0
  11. package/deploy/sandbox-entrypoint.sh +59 -42
  12. package/dist/admin/auth.d.ts +1 -1
  13. package/dist/admin/auth.js +3 -1
  14. package/dist/admin/auth.js.map +1 -1
  15. package/dist/admin/chat-session-reader.d.ts +11 -14
  16. package/dist/admin/chat-session-reader.js +27 -51
  17. package/dist/admin/chat-session-reader.js.map +1 -1
  18. package/dist/admin/docker.d.ts +37 -0
  19. package/dist/admin/docker.js +86 -1
  20. package/dist/admin/docker.js.map +1 -1
  21. package/dist/admin/index.js +38 -3
  22. package/dist/admin/index.js.map +1 -1
  23. package/dist/admin/log-search.test.d.ts +1 -0
  24. package/dist/admin/log-search.test.js +78 -0
  25. package/dist/admin/log-search.test.js.map +1 -0
  26. package/dist/admin/routes.d.ts +52 -3
  27. package/dist/admin/routes.js +780 -63
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/routes.test.js +680 -14
  30. package/dist/admin/routes.test.js.map +1 -1
  31. package/dist/admin/server-logs.test.d.ts +1 -0
  32. package/dist/admin/server-logs.test.js +58 -0
  33. package/dist/admin/server-logs.test.js.map +1 -0
  34. package/dist/admin/sessions.d.ts +26 -39
  35. package/dist/admin/sessions.js +86 -310
  36. package/dist/admin/sessions.js.map +1 -1
  37. package/dist/admin/sessions.test.d.ts +1 -0
  38. package/dist/admin/sessions.test.js +78 -0
  39. package/dist/admin/sessions.test.js.map +1 -0
  40. package/dist/admin/version.d.ts +15 -0
  41. package/dist/admin/version.js +73 -0
  42. package/dist/admin/version.js.map +1 -0
  43. package/dist/admin/version.test.d.ts +1 -0
  44. package/dist/admin/version.test.js +71 -0
  45. package/dist/admin/version.test.js.map +1 -0
  46. package/dist/cli-config.d.ts +55 -0
  47. package/dist/cli-config.js +119 -0
  48. package/dist/cli-config.js.map +1 -0
  49. package/dist/cli-config.test.d.ts +1 -0
  50. package/dist/cli-config.test.js +92 -0
  51. package/dist/cli-config.test.js.map +1 -0
  52. package/dist/cli-format.d.ts +19 -0
  53. package/dist/cli-format.js +107 -0
  54. package/dist/cli-format.js.map +1 -0
  55. package/dist/cli-server.d.ts +73 -0
  56. package/dist/cli-server.js +347 -0
  57. package/dist/cli-server.js.map +1 -0
  58. package/dist/cli-server.test.d.ts +1 -0
  59. package/dist/cli-server.test.js +38 -0
  60. package/dist/cli-server.test.js.map +1 -0
  61. package/dist/cli-timeline.d.ts +35 -0
  62. package/dist/cli-timeline.js +373 -0
  63. package/dist/cli-timeline.js.map +1 -0
  64. package/dist/cli-timeline.test.d.ts +1 -0
  65. package/dist/cli-timeline.test.js +104 -0
  66. package/dist/cli-timeline.test.js.map +1 -0
  67. package/dist/cli.d.ts +0 -19
  68. package/dist/cli.js +910 -194
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config-overlay.test.d.ts +1 -0
  71. package/dist/config-overlay.test.js +112 -0
  72. package/dist/config-overlay.test.js.map +1 -0
  73. package/dist/config-resolve.d.ts +28 -0
  74. package/dist/config-resolve.js +47 -0
  75. package/dist/config-resolve.js.map +1 -0
  76. package/dist/config-resolve.test.d.ts +1 -0
  77. package/dist/config-resolve.test.js +68 -0
  78. package/dist/config-resolve.test.js.map +1 -0
  79. package/dist/config.d.ts +62 -49
  80. package/dist/config.js +452 -76
  81. package/dist/config.js.map +1 -1
  82. package/dist/config.test.js +201 -32
  83. package/dist/config.test.js.map +1 -1
  84. package/dist/connectors/github-webhook.js +83 -5
  85. package/dist/connectors/github-webhook.js.map +1 -1
  86. package/dist/connectors/github-webhook.test.d.ts +1 -0
  87. package/dist/connectors/github-webhook.test.js +156 -0
  88. package/dist/connectors/github-webhook.test.js.map +1 -0
  89. package/dist/connectors/messaging/session-manager.d.ts +18 -0
  90. package/dist/connectors/messaging/session-manager.js +83 -2
  91. package/dist/connectors/messaging/session-manager.js.map +1 -1
  92. package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
  93. package/dist/connectors/messaging/session-manager.test.js +144 -0
  94. package/dist/connectors/messaging/session-manager.test.js.map +1 -0
  95. package/dist/connectors/slack/connector.d.ts +9 -0
  96. package/dist/connectors/slack/connector.js +15 -0
  97. package/dist/connectors/slack/connector.js.map +1 -1
  98. package/dist/connectors/slack/mrkdwn.js +81 -0
  99. package/dist/connectors/slack/mrkdwn.js.map +1 -1
  100. package/dist/connectors/slack/mrkdwn.test.js +49 -0
  101. package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
  102. package/dist/connectors/types.d.ts +1 -1
  103. package/dist/cron/fanout.d.ts +33 -0
  104. package/dist/cron/fanout.js +55 -0
  105. package/dist/cron/fanout.js.map +1 -0
  106. package/dist/cron/fanout.test.d.ts +1 -0
  107. package/dist/cron/fanout.test.js +73 -0
  108. package/dist/cron/fanout.test.js.map +1 -0
  109. package/dist/cron/jobs.d.ts +5 -0
  110. package/dist/cron/jobs.js +10 -3
  111. package/dist/cron/jobs.js.map +1 -1
  112. package/dist/cron/scheduler.d.ts +12 -0
  113. package/dist/cron/scheduler.js +27 -1
  114. package/dist/cron/scheduler.js.map +1 -1
  115. package/dist/engine/agent-executor.d.ts +158 -0
  116. package/dist/engine/agent-executor.js +1140 -0
  117. package/dist/engine/agent-executor.js.map +1 -0
  118. package/dist/engine/agent-executor.test.d.ts +1 -0
  119. package/dist/engine/agent-executor.test.js +395 -0
  120. package/dist/engine/agent-executor.test.js.map +1 -0
  121. package/dist/engine/chat-runner.d.ts +123 -0
  122. package/dist/engine/chat-runner.js +379 -0
  123. package/dist/engine/chat-runner.js.map +1 -0
  124. package/dist/engine/chat-runner.test.d.ts +1 -0
  125. package/dist/engine/chat-runner.test.js +104 -0
  126. package/dist/engine/chat-runner.test.js.map +1 -0
  127. package/dist/engine/chat-skills.d.ts +45 -0
  128. package/dist/engine/chat-skills.js +184 -0
  129. package/dist/engine/chat-skills.js.map +1 -0
  130. package/dist/engine/chat-skills.test.d.ts +1 -0
  131. package/dist/engine/chat-skills.test.js +20 -0
  132. package/dist/engine/chat-skills.test.js.map +1 -0
  133. package/dist/engine/chat.d.ts +20 -23
  134. package/dist/engine/chat.js +251 -155
  135. package/dist/engine/chat.js.map +1 -1
  136. package/dist/engine/chat.test.d.ts +1 -0
  137. package/dist/engine/chat.test.js +42 -0
  138. package/dist/engine/chat.test.js.map +1 -0
  139. package/dist/engine/classifier.d.ts +35 -2
  140. package/dist/engine/classifier.js +170 -31
  141. package/dist/engine/classifier.js.map +1 -1
  142. package/dist/engine/classifier.test.d.ts +1 -0
  143. package/dist/engine/classifier.test.js +115 -0
  144. package/dist/engine/classifier.test.js.map +1 -0
  145. package/dist/engine/dispatcher.d.ts +60 -0
  146. package/dist/engine/dispatcher.js +601 -0
  147. package/dist/engine/dispatcher.js.map +1 -0
  148. package/dist/engine/dispatcher.test.d.ts +1 -0
  149. package/dist/engine/dispatcher.test.js +511 -0
  150. package/dist/engine/dispatcher.test.js.map +1 -0
  151. package/dist/engine/event-shim.d.ts +117 -0
  152. package/dist/engine/event-shim.js +435 -0
  153. package/dist/engine/event-shim.js.map +1 -0
  154. package/dist/engine/event-shim.test.d.ts +1 -0
  155. package/dist/engine/event-shim.test.js +194 -0
  156. package/dist/engine/event-shim.test.js.map +1 -0
  157. package/dist/engine/git-auth.d.ts +13 -17
  158. package/dist/engine/git-auth.js +99 -42
  159. package/dist/engine/git-auth.js.map +1 -1
  160. package/dist/engine/git-auth.test.d.ts +1 -0
  161. package/dist/engine/git-auth.test.js +117 -0
  162. package/dist/engine/git-auth.test.js.map +1 -0
  163. package/dist/engine/github-app-client.d.ts +7 -0
  164. package/dist/engine/github-app-client.js +16 -0
  165. package/dist/engine/github-app-client.js.map +1 -0
  166. package/dist/engine/github-app-client.test.d.ts +1 -0
  167. package/dist/engine/github-app-client.test.js +44 -0
  168. package/dist/engine/github-app-client.test.js.map +1 -0
  169. package/dist/engine/github-tools.d.ts +12 -0
  170. package/dist/engine/github-tools.js +261 -0
  171. package/dist/engine/github-tools.js.map +1 -0
  172. package/dist/engine/github.d.ts +1027 -43
  173. package/dist/engine/github.js +153 -14
  174. package/dist/engine/github.js.map +1 -1
  175. package/dist/engine/llm.d.ts +47 -0
  176. package/dist/engine/llm.js +221 -0
  177. package/dist/engine/llm.js.map +1 -0
  178. package/dist/engine/llm.test.d.ts +1 -0
  179. package/dist/engine/llm.test.js +189 -0
  180. package/dist/engine/llm.test.js.map +1 -0
  181. package/dist/engine/profiles.d.ts +249 -0
  182. package/dist/engine/profiles.js +42 -0
  183. package/dist/engine/profiles.js.map +1 -0
  184. package/dist/engine/router.d.ts +12 -6
  185. package/dist/engine/router.js +339 -81
  186. package/dist/engine/router.js.map +1 -1
  187. package/dist/engine/router.test.js +428 -78
  188. package/dist/engine/router.test.js.map +1 -1
  189. package/dist/engine/screen.d.ts +41 -0
  190. package/dist/engine/screen.js +93 -0
  191. package/dist/engine/screen.js.map +1 -0
  192. package/dist/engine/screen.test.d.ts +1 -0
  193. package/dist/engine/screen.test.js +82 -0
  194. package/dist/engine/screen.test.js.map +1 -0
  195. package/dist/index.js +423 -437
  196. package/dist/index.js.map +1 -1
  197. package/dist/managed-repos.d.ts +7 -9
  198. package/dist/managed-repos.js +12 -15
  199. package/dist/managed-repos.js.map +1 -1
  200. package/dist/managed-repos.test.js +24 -19
  201. package/dist/managed-repos.test.js.map +1 -1
  202. package/dist/notify/index.d.ts +15 -0
  203. package/dist/notify/index.js +6 -0
  204. package/dist/notify/index.js.map +1 -0
  205. package/dist/notify/model.d.ts +57 -0
  206. package/dist/notify/model.js +89 -0
  207. package/dist/notify/model.js.map +1 -0
  208. package/dist/notify/model.test.d.ts +1 -0
  209. package/dist/notify/model.test.js +109 -0
  210. package/dist/notify/model.test.js.map +1 -0
  211. package/dist/notify/notifier.d.ts +17 -0
  212. package/dist/notify/notifier.js +87 -0
  213. package/dist/notify/notifier.js.map +1 -0
  214. package/dist/notify/notifier.test.d.ts +1 -0
  215. package/dist/notify/notifier.test.js +100 -0
  216. package/dist/notify/notifier.test.js.map +1 -0
  217. package/dist/notify/render.d.ts +21 -0
  218. package/dist/notify/render.js +59 -0
  219. package/dist/notify/render.js.map +1 -0
  220. package/dist/notify/render.test.d.ts +1 -0
  221. package/dist/notify/render.test.js +65 -0
  222. package/dist/notify/render.test.js.map +1 -0
  223. package/dist/notify/transports/github.d.ts +26 -0
  224. package/dist/notify/transports/github.js +26 -0
  225. package/dist/notify/transports/github.js.map +1 -0
  226. package/dist/notify/transports/slack.d.ts +26 -0
  227. package/dist/notify/transports/slack.js +28 -0
  228. package/dist/notify/transports/slack.js.map +1 -0
  229. package/dist/notify/transports.test.d.ts +1 -0
  230. package/dist/notify/transports.test.js +71 -0
  231. package/dist/notify/transports.test.js.map +1 -0
  232. package/dist/notify/types.d.ts +95 -0
  233. package/dist/notify/types.js +16 -0
  234. package/dist/notify/types.js.map +1 -0
  235. package/dist/sandbox/docker-compose.test.d.ts +1 -0
  236. package/dist/sandbox/docker-compose.test.js +128 -0
  237. package/dist/sandbox/docker-compose.test.js.map +1 -0
  238. package/dist/sandbox/docker.d.ts +97 -9
  239. package/dist/sandbox/docker.js +192 -41
  240. package/dist/sandbox/docker.js.map +1 -1
  241. package/dist/sandbox/docker.test.d.ts +1 -0
  242. package/dist/sandbox/docker.test.js +137 -0
  243. package/dist/sandbox/docker.test.js.map +1 -0
  244. package/dist/sandbox/egress-allowlist.d.ts +69 -0
  245. package/dist/sandbox/egress-allowlist.js +164 -0
  246. package/dist/sandbox/egress-allowlist.js.map +1 -0
  247. package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
  248. package/dist/sandbox/egress-allowlist.test.js +65 -0
  249. package/dist/sandbox/egress-allowlist.test.js.map +1 -0
  250. package/dist/sandbox/egress-firewall-config.d.ts +127 -0
  251. package/dist/sandbox/egress-firewall-config.js +434 -0
  252. package/dist/sandbox/egress-firewall-config.js.map +1 -0
  253. package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
  254. package/dist/sandbox/egress-firewall-config.test.js +244 -0
  255. package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
  256. package/dist/sandbox/images.d.ts +23 -0
  257. package/dist/sandbox/images.js +55 -0
  258. package/dist/sandbox/images.js.map +1 -0
  259. package/dist/sandbox/index.d.ts +82 -3
  260. package/dist/sandbox/index.js +223 -93
  261. package/dist/sandbox/index.js.map +1 -1
  262. package/dist/sandbox/index.test.d.ts +1 -0
  263. package/dist/sandbox/index.test.js +157 -0
  264. package/dist/sandbox/index.test.js.map +1 -0
  265. package/dist/session-log.d.ts +63 -0
  266. package/dist/session-log.js +290 -0
  267. package/dist/session-log.js.map +1 -0
  268. package/dist/session-log.test.d.ts +1 -0
  269. package/dist/session-log.test.js +85 -0
  270. package/dist/session-log.test.js.map +1 -0
  271. package/dist/setup.d.ts +31 -12
  272. package/dist/setup.js +516 -174
  273. package/dist/setup.js.map +1 -1
  274. package/dist/setup.test.js +138 -6
  275. package/dist/setup.test.js.map +1 -1
  276. package/dist/state/approval-store.d.ts +86 -0
  277. package/dist/state/approval-store.js +140 -0
  278. package/dist/state/approval-store.js.map +1 -0
  279. package/dist/state/build-assets.d.ts +50 -0
  280. package/dist/state/build-assets.js +154 -0
  281. package/dist/state/build-assets.js.map +1 -0
  282. package/dist/state/build-assets.test.d.ts +1 -0
  283. package/dist/state/build-assets.test.js +106 -0
  284. package/dist/state/build-assets.test.js.map +1 -0
  285. package/dist/state/db.d.ts +65 -333
  286. package/dist/state/db.js +112 -835
  287. package/dist/state/db.js.map +1 -1
  288. package/dist/state/db.test.js +127 -91
  289. package/dist/state/db.test.js.map +1 -1
  290. package/dist/state/execution-store.d.ts +257 -0
  291. package/dist/state/execution-store.js +527 -0
  292. package/dist/state/execution-store.js.map +1 -0
  293. package/dist/state/migrate.d.ts +15 -0
  294. package/dist/state/migrate.js +175 -0
  295. package/dist/state/migrate.js.map +1 -0
  296. package/dist/state/workflow-run-store.d.ts +195 -0
  297. package/dist/state/workflow-run-store.js +363 -0
  298. package/dist/state/workflow-run-store.js.map +1 -0
  299. package/dist/state/workflow-run-store.test.d.ts +1 -0
  300. package/dist/state/workflow-run-store.test.js +264 -0
  301. package/dist/state/workflow-run-store.test.js.map +1 -0
  302. package/dist/telemetry/index.d.ts +38 -0
  303. package/dist/telemetry/index.js +253 -0
  304. package/dist/telemetry/index.js.map +1 -0
  305. package/dist/telemetry/index.test.d.ts +1 -0
  306. package/dist/telemetry/index.test.js +73 -0
  307. package/dist/telemetry/index.test.js.map +1 -0
  308. package/dist/telemetry/pi-events.d.ts +12 -0
  309. package/dist/telemetry/pi-events.js +134 -0
  310. package/dist/telemetry/pi-events.js.map +1 -0
  311. package/dist/telemetry/pi-events.test.d.ts +1 -0
  312. package/dist/telemetry/pi-events.test.js +69 -0
  313. package/dist/telemetry/pi-events.test.js.map +1 -0
  314. package/dist/workflows/dag.d.ts +13 -1
  315. package/dist/workflows/dag.js +7 -3
  316. package/dist/workflows/dag.js.map +1 -1
  317. package/dist/workflows/dag.test.js +22 -0
  318. package/dist/workflows/dag.test.js.map +1 -1
  319. package/dist/workflows/golden-build.test.d.ts +1 -0
  320. package/dist/workflows/golden-build.test.js +45 -0
  321. package/dist/workflows/golden-build.test.js.map +1 -0
  322. package/dist/workflows/loader-overlay.test.d.ts +1 -0
  323. package/dist/workflows/loader-overlay.test.js +101 -0
  324. package/dist/workflows/loader-overlay.test.js.map +1 -0
  325. package/dist/workflows/loader.d.ts +36 -11
  326. package/dist/workflows/loader.js +311 -87
  327. package/dist/workflows/loader.js.map +1 -1
  328. package/dist/workflows/loader.test.js +114 -10
  329. package/dist/workflows/loader.test.js.map +1 -1
  330. package/dist/workflows/loop-eval.js +2 -0
  331. package/dist/workflows/loop-eval.js.map +1 -1
  332. package/dist/workflows/loop-eval.test.js +14 -0
  333. package/dist/workflows/loop-eval.test.js.map +1 -1
  334. package/dist/workflows/phase-executor.d.ts +145 -0
  335. package/dist/workflows/phase-executor.js +691 -0
  336. package/dist/workflows/phase-executor.js.map +1 -0
  337. package/dist/workflows/phase-executor.test.d.ts +1 -0
  338. package/dist/workflows/phase-executor.test.js +434 -0
  339. package/dist/workflows/phase-executor.test.js.map +1 -0
  340. package/dist/workflows/phase-ref.d.ts +44 -0
  341. package/dist/workflows/phase-ref.js +78 -0
  342. package/dist/workflows/phase-ref.js.map +1 -0
  343. package/dist/workflows/phase-ref.test.d.ts +1 -0
  344. package/dist/workflows/phase-ref.test.js +24 -0
  345. package/dist/workflows/phase-ref.test.js.map +1 -0
  346. package/dist/workflows/resume.d.ts +5 -11
  347. package/dist/workflows/resume.js +88 -7
  348. package/dist/workflows/resume.js.map +1 -1
  349. package/dist/workflows/runner.d.ts +34 -27
  350. package/dist/workflows/runner.js +252 -930
  351. package/dist/workflows/runner.js.map +1 -1
  352. package/dist/workflows/runner.test.js +346 -35
  353. package/dist/workflows/runner.test.js.map +1 -1
  354. package/dist/workflows/schema.d.ts +52 -10
  355. package/dist/workflows/schema.js +147 -7
  356. package/dist/workflows/schema.js.map +1 -1
  357. package/dist/workflows/simple.d.ts +67 -3
  358. package/dist/workflows/simple.js +248 -87
  359. package/dist/workflows/simple.js.map +1 -1
  360. package/dist/workflows/simple.test.d.ts +1 -0
  361. package/dist/workflows/simple.test.js +107 -0
  362. package/dist/workflows/simple.test.js.map +1 -0
  363. package/dist/workflows/templates.d.ts +29 -0
  364. package/dist/workflows/templates.js +42 -4
  365. package/dist/workflows/templates.js.map +1 -1
  366. package/dist/workflows/templates.test.js +103 -0
  367. package/dist/workflows/templates.test.js.map +1 -1
  368. package/dist/workflows/triggers.d.ts +21 -0
  369. package/dist/workflows/triggers.js +44 -0
  370. package/dist/workflows/triggers.js.map +1 -0
  371. package/dist/workflows/verdict.d.ts +19 -0
  372. package/dist/workflows/verdict.js +30 -0
  373. package/dist/workflows/verdict.js.map +1 -0
  374. package/dist/workflows/verdict.test.d.ts +1 -0
  375. package/dist/workflows/verdict.test.js +44 -0
  376. package/dist/workflows/verdict.test.js.map +1 -0
  377. package/dist/worktree/manager.d.ts +1 -1
  378. package/dist/worktree/manager.js +14 -14
  379. package/dist/worktree/manager.js.map +1 -1
  380. package/dist/worktree/manager.test.d.ts +1 -0
  381. package/dist/worktree/manager.test.js +87 -0
  382. package/dist/worktree/manager.test.js.map +1 -0
  383. package/docker-compose.yml +206 -5
  384. package/package.json +19 -7
  385. package/sandbox.Dockerfile +97 -18
  386. package/skills/README.md +40 -0
  387. package/skills/browser-qa/SKILL.md +193 -0
  388. package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
  389. package/skills/building/SKILL.md +95 -0
  390. package/skills/chat/SKILL.md +30 -11
  391. package/skills/code-review/SKILL.md +59 -0
  392. package/skills/debug-production/SKILL.md +108 -0
  393. package/skills/demo/SKILL.md +194 -0
  394. package/skills/demo/scripts/compose-demo.sh +205 -0
  395. package/skills/issue-answer/SKILL.md +90 -0
  396. package/skills/issue-comment/SKILL.md +38 -24
  397. package/skills/issue-triage/SKILL.md +103 -37
  398. package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
  399. package/skills/pr-comment/SKILL.md +64 -0
  400. package/skills/pr-review/SKILL.md +65 -49
  401. package/skills/qa-test/SKILL.md +97 -0
  402. package/skills/repo-health/SKILL.md +48 -45
  403. package/skills/security-feedback/SKILL.md +173 -0
  404. package/skills/security-feedback/references/templates.md +77 -0
  405. package/skills/security-review/SKILL.md +213 -0
  406. package/skills/security-review/references/issue-format.md +302 -0
  407. package/skills/verify/SKILL.md +118 -0
  408. package/workflows/answer.yaml +37 -0
  409. package/workflows/build.yaml +32 -22
  410. package/workflows/cron-security.yaml +6 -0
  411. package/workflows/demo.yaml +55 -0
  412. package/workflows/explore.yaml +9 -0
  413. package/workflows/pr-comment.yaml +16 -0
  414. package/workflows/pr-fix.yaml +3 -0
  415. package/workflows/pr-review.yaml +4 -1
  416. package/workflows/prompts/answer.md +67 -0
  417. package/workflows/prompts/architect.md +24 -7
  418. package/workflows/prompts/demo.md +100 -0
  419. package/workflows/prompts/executor.md +29 -20
  420. package/workflows/prompts/explore-ask.md +51 -22
  421. package/workflows/prompts/explore-publish.md +2 -2
  422. package/workflows/prompts/explore-read.md +24 -10
  423. package/workflows/prompts/explore-synthesize.md +15 -8
  424. package/workflows/prompts/fix.md +9 -10
  425. package/workflows/prompts/guardrails.md +26 -8
  426. package/workflows/prompts/pr-fix.md +6 -7
  427. package/workflows/prompts/pr.md +11 -10
  428. package/workflows/prompts/qa-browser.md +95 -0
  429. package/workflows/prompts/qa-synth.md +44 -0
  430. package/workflows/prompts/qa-test.md +60 -0
  431. package/workflows/prompts/re-reviewer.md +8 -9
  432. package/workflows/prompts/reviewer.md +10 -9
  433. package/workflows/prompts/verify-browser.md +93 -0
  434. package/workflows/prompts/verify-synth.md +44 -0
  435. package/workflows/prompts/verify.md +63 -0
  436. package/workflows/qa-test.yaml +87 -0
  437. package/workflows/security-feedback.yaml +25 -0
  438. package/workflows/security-review.yaml +29 -0
  439. package/workflows/verify.yaml +85 -0
  440. package/deploy/mcp-config.tmpl.json +0 -14
  441. package/dist/cron/rate-limits.d.ts +0 -26
  442. package/dist/cron/rate-limits.js +0 -193
  443. package/dist/cron/rate-limits.js.map +0 -1
  444. package/dist/engine/executor.d.ts +0 -75
  445. package/dist/engine/executor.js +0 -292
  446. package/dist/engine/executor.js.map +0 -1
  447. package/mcp-github-app/package.json +0 -18
  448. package/mcp-github-app/src/auth.js +0 -66
  449. package/mcp-github-app/src/github.js +0 -371
  450. package/mcp-github-app/src/index.js +0 -534
  451. package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
  452. package/skills/github/DESCRIPTION.md +0 -3
  453. package/skills/github/codebase-inspection/SKILL.md +0 -115
  454. package/skills/github/github-auth/SKILL.md +0 -54
  455. package/skills/github/github-auth/scripts/gh-env.sh +0 -66
  456. package/skills/github/github-code-review/SKILL.md +0 -480
  457. package/skills/github/github-code-review/references/review-output-template.md +0 -74
  458. package/skills/github/github-issues/SKILL.md +0 -369
  459. package/skills/github/github-issues/templates/bug-report.md +0 -35
  460. package/skills/github/github-issues/templates/feature-request.md +0 -31
  461. package/skills/github/github-pr-workflow/SKILL.md +0 -395
  462. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
  463. package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
  464. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
  465. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
  466. package/skills/github/github-repo-management/SKILL.md +0 -515
  467. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
  468. package/skills/github-orchestrator/SKILL.md +0 -103
  469. package/skills/mcp/DESCRIPTION.md +0 -3
  470. package/skills/mcp/mcporter/SKILL.md +0 -122
  471. package/skills/mcp/native-mcp/SKILL.md +0 -356
  472. package/skills/software-development/architect/SKILL.md +0 -154
  473. package/skills/software-development/assure-guardrails/SKILL.md +0 -239
  474. package/skills/software-development/plan/SKILL.md +0 -64
  475. package/skills/software-development/requesting-code-review/SKILL.md +0 -291
  476. package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
  477. package/skills/software-development/systematic-debugging/SKILL.md +0 -366
  478. package/skills/software-development/test-driven-development/SKILL.md +0 -342
@@ -0,0 +1,189 @@
1
+ import { describe, it, expect, afterEach, vi } from "vitest";
2
+ import { callLlm, chat, defaultFastModel, resolveProvider } from "./llm.js";
3
+ describe("resolveProvider", () => {
4
+ it("prefers explicit provider prefix", () => {
5
+ expect(resolveProvider("anthropic/claude-haiku-4-5")).toEqual({ provider: "anthropic", modelId: "claude-haiku-4-5" });
6
+ expect(resolveProvider("openai/gpt-4o-mini")).toEqual({ provider: "openai", modelId: "gpt-4o-mini" });
7
+ });
8
+ it("keeps the nested vendor/model tail for openrouter ids", () => {
9
+ expect(resolveProvider("openrouter/anthropic/claude-sonnet-4.5"))
10
+ .toEqual({ provider: "openrouter", modelId: "anthropic/claude-sonnet-4.5" });
11
+ expect(resolveProvider("openrouter/google/gemini-2.5-flash"))
12
+ .toEqual({ provider: "openrouter", modelId: "google/gemini-2.5-flash" });
13
+ });
14
+ it("infers from common naming for unprefixed model ids", () => {
15
+ expect(resolveProvider("claude-3-5-haiku")).toEqual({ provider: "anthropic", modelId: "claude-3-5-haiku" });
16
+ expect(resolveProvider("gpt-4o-mini")).toEqual({ provider: "openai", modelId: "gpt-4o-mini" });
17
+ });
18
+ it("falls back to openai for unrecognized bare ids", () => {
19
+ expect(resolveProvider("mystery-model")).toEqual({ provider: "openai", modelId: "mystery-model" });
20
+ });
21
+ it("throws on an explicit unsupported provider prefix instead of silently mis-routing", () => {
22
+ expect(() => resolveProvider("mistral/large-latest")).toThrow(/unsupported provider prefix "mistral"/);
23
+ expect(() => resolveProvider("google/gemini-pro")).toThrow(/unsupported provider prefix "google"/);
24
+ });
25
+ });
26
+ describe("defaultFastModel", () => {
27
+ const ORIGINAL_ENV = { ...process.env };
28
+ afterEach(() => { process.env = { ...ORIGINAL_ENV }; });
29
+ it("picks an OpenAI model when only OPENAI_API_KEY is set", () => {
30
+ delete process.env.ANTHROPIC_API_KEY;
31
+ process.env.OPENAI_API_KEY = "k";
32
+ delete process.env.OPENCODE_MODELS;
33
+ expect(defaultFastModel()).toMatch(/^openai\//);
34
+ });
35
+ it("picks an Anthropic model when only ANTHROPIC_API_KEY is set", () => {
36
+ process.env.ANTHROPIC_API_KEY = "k";
37
+ delete process.env.OPENAI_API_KEY;
38
+ delete process.env.OPENROUTER_API_KEY;
39
+ delete process.env.OPENCODE_MODELS;
40
+ expect(defaultFastModel()).toMatch(/^anthropic\//);
41
+ });
42
+ it("picks an OpenRouter model when only OPENROUTER_API_KEY is set", () => {
43
+ delete process.env.ANTHROPIC_API_KEY;
44
+ delete process.env.OPENAI_API_KEY;
45
+ process.env.OPENROUTER_API_KEY = "sk-or-k";
46
+ delete process.env.OPENCODE_MODELS;
47
+ expect(defaultFastModel()).toMatch(/^openrouter\//);
48
+ });
49
+ it("prefers Anthropic over OpenRouter when both are set (avoids markup)", () => {
50
+ process.env.ANTHROPIC_API_KEY = "k";
51
+ process.env.OPENROUTER_API_KEY = "sk-or-k";
52
+ delete process.env.OPENAI_API_KEY;
53
+ delete process.env.OPENCODE_MODELS;
54
+ expect(defaultFastModel()).toMatch(/^anthropic\//);
55
+ });
56
+ it("uses the first registry provider when all keys are set", () => {
57
+ process.env.ANTHROPIC_API_KEY = "k";
58
+ process.env.OPENAI_API_KEY = "k";
59
+ process.env.OPENROUTER_API_KEY = "sk-or-k";
60
+ delete process.env.OPENCODE_MODELS;
61
+ expect(defaultFastModel()).toMatch(/^anthropic\//);
62
+ });
63
+ it("honors per-task OPENCODE_MODELS overrides", () => {
64
+ process.env.OPENAI_API_KEY = "k";
65
+ process.env.OPENCODE_MODELS = JSON.stringify({ classifier: "openai/custom-mini" });
66
+ expect(defaultFastModel("classifier")).toBe("openai/custom-mini");
67
+ expect(defaultFastModel("screener")).toMatch(/^openai\//);
68
+ });
69
+ it("ignores invalid OPENCODE_MODELS JSON", () => {
70
+ process.env.OPENAI_API_KEY = "k";
71
+ delete process.env.ANTHROPIC_API_KEY;
72
+ process.env.OPENCODE_MODELS = "not-json";
73
+ expect(defaultFastModel("classifier")).toMatch(/^openai\//);
74
+ });
75
+ });
76
+ describe("chat", () => {
77
+ const ORIGINAL_ENV = { ...process.env };
78
+ afterEach(() => {
79
+ vi.restoreAllMocks();
80
+ process.env = { ...ORIGINAL_ENV };
81
+ });
82
+ it("throws when the relevant API key is missing", async () => {
83
+ delete process.env.ANTHROPIC_API_KEY;
84
+ await expect(chat("anthropic/claude-haiku-4-5", [{ role: "system", content: "sys" }, { role: "user", content: "hi" }])).rejects.toThrow(/ANTHROPIC_API_KEY/);
85
+ delete process.env.OPENAI_API_KEY;
86
+ await expect(chat("openai/gpt-4o-mini", [{ role: "system", content: "sys" }, { role: "user", content: "hi" }])).rejects.toThrow(/OPENAI_API_KEY/);
87
+ delete process.env.OPENROUTER_API_KEY;
88
+ await expect(chat("openrouter/google/gemini-2.5-flash", [{ role: "system", content: "sys" }, { role: "user", content: "hi" }])).rejects.toThrow(/OPENROUTER_API_KEY/);
89
+ });
90
+ it("hits the Anthropic endpoint and extracts text from content blocks", async () => {
91
+ process.env.ANTHROPIC_API_KEY = "test-key";
92
+ const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(JSON.stringify({
93
+ content: [
94
+ { type: "text", text: "hello " },
95
+ { type: "text", text: "world" },
96
+ { type: "tool_use", text: "ignored" },
97
+ ],
98
+ }), { status: 200, headers: { "content-type": "application/json" } }));
99
+ const out = await chat("claude-haiku-4-5", [{ role: "system", content: "sys" }, { role: "user", content: "user" }]);
100
+ expect(out).toBe("hello world");
101
+ expect(fetchMock).toHaveBeenCalledTimes(1);
102
+ const [url, init] = fetchMock.mock.calls[0];
103
+ expect(url).toBe("https://api.anthropic.com/v1/messages");
104
+ expect(init.headers).toMatchObject({ "x-api-key": "test-key" });
105
+ const body = JSON.parse(init.body);
106
+ expect(body.model).toBe("claude-haiku-4-5");
107
+ expect(body.system).toBe("sys");
108
+ expect(body.messages).toEqual([{ role: "user", content: "user" }]);
109
+ });
110
+ it("hits the OpenAI endpoint and extracts choices[0].message.content", async () => {
111
+ process.env.OPENAI_API_KEY = "test-key";
112
+ const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(JSON.stringify({
113
+ choices: [{ message: { content: "ok" } }],
114
+ }), { status: 200, headers: { "content-type": "application/json" } }));
115
+ const out = await chat("openai/gpt-4o-mini", [{ role: "system", content: "sys" }, { role: "user", content: "user" }]);
116
+ expect(out).toBe("ok");
117
+ expect(fetchMock).toHaveBeenCalledTimes(1);
118
+ const [url, init] = fetchMock.mock.calls[0];
119
+ expect(url).toBe("https://api.openai.com/v1/chat/completions");
120
+ expect(init.headers).toMatchObject({ authorization: "Bearer test-key" });
121
+ const body = JSON.parse(init.body);
122
+ expect(body.model).toBe("gpt-4o-mini");
123
+ expect(body.max_completion_tokens).toBe(256);
124
+ expect(body.max_tokens).toBeUndefined();
125
+ expect(body.messages).toEqual([
126
+ { role: "system", content: "sys" },
127
+ { role: "user", content: "user" },
128
+ ]);
129
+ });
130
+ it("hits the OpenRouter endpoint, sends the nested vendor/model tail, and uses max_tokens", async () => {
131
+ process.env.OPENROUTER_API_KEY = "sk-or-test";
132
+ const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(JSON.stringify({
133
+ choices: [{ message: { content: "routed" } }],
134
+ }), { status: 200, headers: { "content-type": "application/json" } }));
135
+ const out = await chat("openrouter/anthropic/claude-sonnet-4.5", [{ role: "system", content: "sys" }, { role: "user", content: "user" }]);
136
+ expect(out).toBe("routed");
137
+ expect(fetchMock).toHaveBeenCalledTimes(1);
138
+ const [url, init] = fetchMock.mock.calls[0];
139
+ expect(url).toBe("https://openrouter.ai/api/v1/chat/completions");
140
+ expect(init.headers).toMatchObject({ authorization: "Bearer sk-or-test" });
141
+ const body = JSON.parse(init.body);
142
+ // The "openrouter/" prefix is stripped but the nested vendor/model tail
143
+ // is preserved verbatim — that's the id OpenRouter's API expects.
144
+ expect(body.model).toBe("anthropic/claude-sonnet-4.5");
145
+ // OpenRouter forwards to many providers — use the cross-provider field,
146
+ // not OpenAI's newer `max_completion_tokens`.
147
+ expect(body.max_tokens).toBe(256);
148
+ expect(body.max_completion_tokens).toBeUndefined();
149
+ expect(body.messages).toEqual([
150
+ { role: "system", content: "sys" },
151
+ { role: "user", content: "user" },
152
+ ]);
153
+ });
154
+ it("throws on non-2xx upstream after exhausting the retry", async () => {
155
+ process.env.OPENAI_API_KEY = "test-key";
156
+ const fetchMock = vi.spyOn(globalThis, "fetch")
157
+ .mockResolvedValueOnce(new Response("rate limited", { status: 429 }))
158
+ .mockResolvedValueOnce(new Response("rate limited", { status: 429 }));
159
+ await expect(chat("openai/gpt-4o-mini", [{ role: "system", content: "s" }, { role: "user", content: "u" }])).rejects.toThrow(/429/);
160
+ expect(fetchMock).toHaveBeenCalledTimes(2);
161
+ });
162
+ it("retries transient 429/5xx once and returns the second response", async () => {
163
+ process.env.OPENAI_API_KEY = "test-key";
164
+ const fetchMock = vi.spyOn(globalThis, "fetch")
165
+ .mockResolvedValueOnce(new Response("rate limited", { status: 429 }))
166
+ .mockResolvedValueOnce(new Response(JSON.stringify({ choices: [{ message: { content: "ok" } }] }), {
167
+ status: 200,
168
+ headers: { "content-type": "application/json" },
169
+ }));
170
+ const out = await chat("openai/gpt-4o-mini", [{ role: "system", content: "s" }, { role: "user", content: "u" }]);
171
+ expect(out).toBe("ok");
172
+ expect(fetchMock).toHaveBeenCalledTimes(2);
173
+ });
174
+ it("does not retry deterministic 4xx errors (e.g. 400 bad request)", async () => {
175
+ process.env.OPENAI_API_KEY = "test-key";
176
+ const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response("bad model id", { status: 400 }));
177
+ await expect(chat("openai/gpt-4o-mini", [{ role: "system", content: "s" }, { role: "user", content: "u" }])).rejects.toThrow(/400/);
178
+ expect(fetchMock).toHaveBeenCalledTimes(1);
179
+ });
180
+ it("callLlm delegates to chat-equivalent behavior", async () => {
181
+ process.env.OPENAI_API_KEY = "test-key";
182
+ vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(JSON.stringify({ choices: [{ message: { content: "delegated" } }] }), {
183
+ status: 200,
184
+ headers: { "content-type": "application/json" },
185
+ }));
186
+ await expect(callLlm("openai/gpt-4o-mini", "s", "u")).resolves.toBe("delegated");
187
+ });
188
+ });
189
+ //# sourceMappingURL=llm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.test.js","sourceRoot":"","sources":["../../src/engine/llm.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ import type { GitHubTokenPermissions } from "./git-auth.js";
2
+ import type { BuildAssetsLocation, OtelConfig, SandboxBackend } from "../config.js";
3
+ /**
4
+ * Configuration for an agent execution.
5
+ */
6
+ export interface ExecutorConfig {
7
+ /** Working directory for the agent (used by the no-sandbox path). */
8
+ cwd?: string;
9
+ /** Maximum conversation turns. Unused by agentic-pi; kept for API stability. */
10
+ maxTurns?: number;
11
+ /** Model id (e.g. "anthropic/claude-sonnet-4-6"). */
12
+ model?: string;
13
+ /**
14
+ * Pi thinking level: `off | minimal | low | medium | high | xhigh`.
15
+ * Forwarded to agentic-pi as the `thinking` option. When omitted,
16
+ * agentic-pi uses the model's default.
17
+ */
18
+ variant?: string;
19
+ /** Path to agent context directory. */
20
+ agentContextDir?: string;
21
+ /** Directory for persistent state. */
22
+ stateDir?: string;
23
+ /** Directory for agent sandboxes (cloned repos). */
24
+ sandboxDir?: string;
25
+ /** Where the shim writes dashboard envelope jsonl. */
26
+ sessionsDir?: string;
27
+ /** Workflow sandbox backend (overrides config-level default). */
28
+ sandbox?: SandboxBackend;
29
+ /**
30
+ * Which docker sandbox image this phase runs in: `"qa"` selects the
31
+ * browser-QA image (Playwright + Chromium), anything else the lean default.
32
+ * Overlaid per-phase from `sandbox_image:` by `phaseConfigFor`; only acted on
33
+ * by the docker path.
34
+ */
35
+ sandboxImage?: "default" | "qa";
36
+ /**
37
+ * Where build handoff docs live for this run:
38
+ * - "repo" (default): the agent writes/commits `.lastlight/<issueKey>/`
39
+ * into the target repo branch; the stage-in/harvest seam is skipped.
40
+ * - "server": docs are staged in from / harvested back to the server store
41
+ * under `buildAssetsDir`, never committed. Set from the runtime config.
42
+ */
43
+ buildAssets?: BuildAssetsLocation;
44
+ /** Filesystem root for the server-mode build-assets store (when buildAssets === "server"). */
45
+ buildAssetsDir?: string;
46
+ /**
47
+ * Server-mode artifact identity for this run. Used by the stage-in/harvest
48
+ * seam to locate the run's docs in the store at
49
+ * `<buildAssetsDir>/<owner>/<repo>/<issueKey>/`. Set per run from simple.ts.
50
+ */
51
+ buildAssetsKey?: {
52
+ owner: string;
53
+ repo: string;
54
+ issueKey: string;
55
+ };
56
+ /**
57
+ * Bypass the HTTP egress allowlist for this phase. When true:
58
+ * - gondolin: `allowedHttpHosts: ["*"]` is passed to agentic-pi.
59
+ * - docker: the sandbox container uses the open CoreDNS/nginx
60
+ * egress-firewall pair instead of the strict one.
61
+ *
62
+ * Default false. Set via the `unrestricted_egress` field on a workflow
63
+ * phase — used for phases that need broad web access (e.g. an explore
64
+ * phase that searches third-party documentation).
65
+ */
66
+ unrestrictedEgress?: boolean;
67
+ /**
68
+ * Enable agentic-pi's web-search extension (`web_search` / `web_fetch`
69
+ * tools). Default false. agentic-pi auto-enables web search whenever a
70
+ * provider env var (`TAVILY_API_KEY`, `BRAVE_SEARCH_API_KEY`,
71
+ * `EXA_API_KEY`) is present, so we pass an explicit `false` downstream
72
+ * to suppress auto-enable for non-explore workflows.
73
+ */
74
+ webSearch?: boolean;
75
+ /**
76
+ * Force a specific web-search provider. When unset, agentic-pi picks
77
+ * one based on which API key env var is present (Tavily > Exa > Brave).
78
+ */
79
+ webSearchProvider?: "tavily" | "brave" | "exa";
80
+ /** Controls OTEL env forwarding and PI event redaction for workflow phase runs. */
81
+ otel?: OtelConfig;
82
+ telemetry?: {
83
+ workflowName?: string;
84
+ phaseName?: string;
85
+ triggerId?: string;
86
+ workflowRunId?: string;
87
+ };
88
+ /**
89
+ * Absolute host paths to skill directories (each containing SKILL.md
90
+ * plus optional scripts/, references/, assets/). Staged into a per-phase
91
+ * bundle at `.lastlight-skills/<phaseName>/<basename>/` before the agent
92
+ * runs — gondolin/none via symlink, docker via copy — and passed to pi
93
+ * explicitly (`--skill` in docker, `skillPaths` in-process). cwd stays the
94
+ * repo; the bundle is a workspace-root sibling of the repo (never committed)
95
+ * on docker/none, and under the repo + local `.git/info/exclude` on gondolin
96
+ * (which mounts only cwd). Keyed per phase so parallel phases stay isolated.
97
+ * Resolved by `phaseConfigFor` in the workflow runner from the phase's
98
+ * `skill:`/`skills:` field.
99
+ */
100
+ skillPaths?: string[];
101
+ }
102
+ /**
103
+ * Normalized status of one agentic-pi extension for a single run.
104
+ * Keyed by extension name ("file-search" | "github" | "web-search") in
105
+ * an {@link ExtensionStatusMap}. agentic-pi emits these as `extension_status`
106
+ * events at run start and on `RunResult.{fileSearch,github,webSearch}`;
107
+ * lastlight captures them so the dashboard and logs show which extensions
108
+ * (e.g. FFF file-search) were actually active.
109
+ */
110
+ export interface ExtensionStatus {
111
+ /** "configured" when the extension loaded, "skipped" otherwise. */
112
+ status: string;
113
+ /** file-search only: "override" | "tools-only" | "tools-and-ui". */
114
+ mode?: string;
115
+ /** web-search only: the resolved search provider. */
116
+ provider?: string;
117
+ /** Number of tools the extension registered. */
118
+ toolCount?: number;
119
+ /** Why it was skipped (e.g. "no-credentials", "resolve-failed"). */
120
+ reason?: string;
121
+ }
122
+ export type ExtensionStatusMap = Record<string, ExtensionStatus>;
123
+ /**
124
+ * One skill agentic-pi discovered for a run, flattened from the
125
+ * `skills_status` event's `skills[]`. Mirrors agentic-pi's `SkillSummary`.
126
+ */
127
+ export interface SkillSummary {
128
+ /** Skill name (from SKILL.md frontmatter). */
129
+ name: string;
130
+ /** Absolute path to the skill's SKILL.md. */
131
+ source: string;
132
+ /**
133
+ * Whether the model can auto-invoke it. False when the skill set
134
+ * `disable-model-invocation: true` — present but not surfaced in the
135
+ * system prompt, so worth flagging in the dashboard.
136
+ */
137
+ modelInvocable: boolean;
138
+ }
139
+ /**
140
+ * Normalized status of agentic-pi's skill discovery for a single run — the
141
+ * skill-loading counterpart to {@link ExtensionStatus} (tool loading).
142
+ * agentic-pi (≥0.2.6) emits this as a single, gated `skills_status` event at
143
+ * run start: present only when skills were configured (`skillPaths`/`noSkills`)
144
+ * or at least one was discovered, absent on a default run with no skills.
145
+ * lastlight captures it so the dashboard's phase-detail panel can show which
146
+ * skills the agent had available.
147
+ */
148
+ export interface SkillsStatus {
149
+ /**
150
+ * "default" (rely on auto-discovery), "configured" (explicit `skillPaths`
151
+ * resolved), or "disabled" (`noSkills` with no explicit paths).
152
+ */
153
+ status: string;
154
+ /** Number of skills the resource loader actually discovered. */
155
+ discovered: number;
156
+ /** The discovered skills, flattened. */
157
+ skills: SkillSummary[];
158
+ /** Operator-mapped skill paths that resolved (echoed for observability). */
159
+ mappedPaths: string[];
160
+ /** Whether agentic-pi's default skill discovery was disabled. */
161
+ noSkills: boolean;
162
+ }
163
+ /**
164
+ * Result from an agent execution.
165
+ */
166
+ export interface ExecutionResult {
167
+ success: boolean;
168
+ output: string;
169
+ turns: number;
170
+ error?: string;
171
+ durationMs: number;
172
+ /** Session id captured from the runtime's stream. */
173
+ sessionId?: string;
174
+ /** Total USD cost reported by the runtime. Zero under OAuth/subscription auth. */
175
+ costUsd?: number;
176
+ /** Tokens billed as fresh input (no cache hit). */
177
+ inputTokens?: number;
178
+ /** Tokens that triggered a cache write. */
179
+ cacheCreationInputTokens?: number;
180
+ /** Tokens served from prompt cache (heavily discounted). */
181
+ cacheReadInputTokens?: number;
182
+ /** Output tokens generated by the model. */
183
+ outputTokens?: number;
184
+ /** API-side duration (excludes orchestrator overhead). */
185
+ apiDurationMs?: number;
186
+ /** Mapped stop reason ("success" / "error_*" / etc.). */
187
+ stopReason?: string;
188
+ /**
189
+ * Which agentic-pi extensions were active for this run, keyed by name.
190
+ * Surfaced in the dashboard's phase-detail panel and persisted to the
191
+ * `executions.extension_status` column.
192
+ */
193
+ extensions?: ExtensionStatusMap;
194
+ /**
195
+ * Skill-loading status captured from agentic-pi's `skills_status` event.
196
+ * Surfaced alongside {@link extensions} in the dashboard's phase-detail
197
+ * panel and persisted to the `executions.skills_status` column. Undefined
198
+ * when the run reported no skills (the event is gated on the agentic-pi side).
199
+ */
200
+ skills?: SkillsStatus;
201
+ }
202
+ export type GitAccessProfile = "read" | "issues-write" | "review-write" | "repo-write";
203
+ /**
204
+ * agentic-pi's GitHub extension uses the same four profile names — they
205
+ * pass through unchanged. Kept as an explicit map so renames on either
206
+ * side surface as a type error rather than a silent runtime mismatch.
207
+ */
208
+ export declare const AGENTIC_PROFILE_FOR: Record<GitAccessProfile, string>;
209
+ export interface GitSandboxAccess {
210
+ owner: string;
211
+ repo: string;
212
+ profile: GitAccessProfile;
213
+ /**
214
+ * When true, sandbox MCP can mint/refresh tokens using the app PEM.
215
+ * Leave false for lower-trust runs to keep private key material inaccessible.
216
+ */
217
+ allowMcpAppAuth?: boolean;
218
+ /**
219
+ * When set, the harness pre-clones the repo at this branch into the
220
+ * task's workspace before the sandbox container starts. The agent then
221
+ * sees the workspace already checked out — no `clone_repo` call needed
222
+ * inside the session. Used by read-only workflows (pr-review, pr-fix)
223
+ * that operate on an existing branch rather than creating one.
224
+ *
225
+ * Build-style workflows that create a new lastlight/* branch from main
226
+ * leave this unset — they start empty and let the agent set up the
227
+ * branch fresh.
228
+ */
229
+ prePopulateBranch?: string;
230
+ /**
231
+ * The owning workflow run id. Stamped into a `<workDir>/.lastlight-run`
232
+ * marker by the pre-clone so a reused per-PR workspace (see
233
+ * `workflowScopedTaskId` for pr-review / pr-fix) can tell "next phase of
234
+ * the same run" (preserve the checkout — build's plan.md lives here) from
235
+ * "a fresh run reusing an old PR dir" (fetch + hard-reset + clean, keeping
236
+ * node_modules warm). Unset for non-workflow callers, which keep the old
237
+ * skip-if-`.git`-exists behaviour.
238
+ */
239
+ runId?: string;
240
+ /**
241
+ * Clone shallowly (`--depth 1 --single-branch`). Set for read-only
242
+ * workflows that never need history; repo-write workflows (build, pr-fix,
243
+ * security-feedback) keep the deeper `--depth 50` clone so rebases / amends
244
+ * have headroom.
245
+ */
246
+ shallow?: boolean;
247
+ }
248
+ export declare const GITHUB_PERMISSION_PROFILES: Record<GitAccessProfile, GitHubTokenPermissions>;
249
+ export declare function loadAgentContext(_dir?: string): string;
@@ -0,0 +1,42 @@
1
+ import { loadAgentContext as loadResolvedAgentContext } from "../workflows/loader.js";
2
+ /**
3
+ * agentic-pi's GitHub extension uses the same four profile names — they
4
+ * pass through unchanged. Kept as an explicit map so renames on either
5
+ * side surface as a type error rather than a silent runtime mismatch.
6
+ */
7
+ export const AGENTIC_PROFILE_FOR = {
8
+ read: "read",
9
+ "issues-write": "issues-write",
10
+ "review-write": "review-write",
11
+ "repo-write": "repo-write",
12
+ };
13
+ export const GITHUB_PERMISSION_PROFILES = {
14
+ read: {
15
+ contents: "read",
16
+ issues: "read",
17
+ pull_requests: "read",
18
+ metadata: "read",
19
+ },
20
+ "issues-write": {
21
+ contents: "read",
22
+ issues: "write",
23
+ pull_requests: "read",
24
+ metadata: "read",
25
+ },
26
+ "review-write": {
27
+ contents: "read",
28
+ issues: "write",
29
+ pull_requests: "write",
30
+ metadata: "read",
31
+ },
32
+ "repo-write": {
33
+ contents: "write",
34
+ issues: "write",
35
+ pull_requests: "write",
36
+ metadata: "read",
37
+ },
38
+ };
39
+ export function loadAgentContext(_dir) {
40
+ return loadResolvedAgentContext();
41
+ }
42
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/engine/profiles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,IAAI,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AA6MtF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,cAAc;IAC9B,cAAc,EAAE,cAAc;IAC9B,YAAY,EAAE,YAAY;CAC3B,CAAC;AA0CF,MAAM,CAAC,MAAM,0BAA0B,GAAqD;IAC1F,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,MAAM;QACd,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE,MAAM;KACjB;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,OAAO;QACf,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE,MAAM;KACjB;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,OAAO;QACf,aAAa,EAAE,OAAO;QACtB,QAAQ,EAAE,MAAM;KACjB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO;QACf,aAAa,EAAE,OAAO;QACtB,QAAQ,EAAE,MAAM;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,wBAAwB,EAAE,CAAC;AACpC,CAAC"}
@@ -1,9 +1,14 @@
1
1
  import type { EventEnvelope } from "../connectors/types.js";
2
2
  import type { StateDb } from "../state/db.js";
3
- /** Skill name that should handle this event */
4
- export type RoutingResult = {
5
- action: "skill";
6
- skill: string;
3
+ /**
4
+ * A routing decision — the single term for "what should process this event"
5
+ * is `handler`. It names either an in-process handler (chat, status-report,
6
+ * approval-response, …) or a workflow (issue-triage, pr-review, build, …);
7
+ * the dispatcher decides which. The router itself performs no side effects.
8
+ */
9
+ export type Route = {
10
+ action: "handler";
11
+ handler: string;
7
12
  context: Record<string, unknown>;
8
13
  } | {
9
14
  action: "reply";
@@ -18,6 +23,7 @@ export interface RouterDeps {
18
23
  }
19
24
  /**
20
25
  * Event routing — deterministic for most events, LLM-classified for comments.
21
- * Maps normalized events to the skill that should handle them.
26
+ * Maps normalized events to the handler that should process them. Returns a
27
+ * decision only; the dispatcher performs the side effects.
22
28
  */
23
- export declare function routeEvent(envelope: EventEnvelope, deps?: RouterDeps): Promise<RoutingResult>;
29
+ export declare function routeEvent(envelope: EventEnvelope, deps?: RouterDeps): Promise<Route>;