lastlight 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/README.md +265 -118
  2. package/agent-context/rules.md +62 -9
  3. package/agent-context/security.md +69 -0
  4. package/config/default.yaml +89 -0
  5. package/deploy/.env.production.example +20 -2
  6. package/deploy/entrypoint.sh +16 -17
  7. package/deploy/native/README.md +160 -0
  8. package/deploy/native/install.sh +110 -0
  9. package/deploy/native/lastlight.env.example +95 -0
  10. package/deploy/native/lastlight.service +50 -0
  11. package/deploy/sandbox-entrypoint.sh +59 -42
  12. package/dist/admin/auth.d.ts +1 -1
  13. package/dist/admin/auth.js +3 -1
  14. package/dist/admin/auth.js.map +1 -1
  15. package/dist/admin/chat-session-reader.d.ts +11 -14
  16. package/dist/admin/chat-session-reader.js +27 -51
  17. package/dist/admin/chat-session-reader.js.map +1 -1
  18. package/dist/admin/docker.d.ts +37 -0
  19. package/dist/admin/docker.js +86 -1
  20. package/dist/admin/docker.js.map +1 -1
  21. package/dist/admin/index.js +38 -3
  22. package/dist/admin/index.js.map +1 -1
  23. package/dist/admin/log-search.test.d.ts +1 -0
  24. package/dist/admin/log-search.test.js +78 -0
  25. package/dist/admin/log-search.test.js.map +1 -0
  26. package/dist/admin/routes.d.ts +52 -3
  27. package/dist/admin/routes.js +780 -63
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/routes.test.js +680 -14
  30. package/dist/admin/routes.test.js.map +1 -1
  31. package/dist/admin/server-logs.test.d.ts +1 -0
  32. package/dist/admin/server-logs.test.js +58 -0
  33. package/dist/admin/server-logs.test.js.map +1 -0
  34. package/dist/admin/sessions.d.ts +26 -39
  35. package/dist/admin/sessions.js +86 -310
  36. package/dist/admin/sessions.js.map +1 -1
  37. package/dist/admin/sessions.test.d.ts +1 -0
  38. package/dist/admin/sessions.test.js +78 -0
  39. package/dist/admin/sessions.test.js.map +1 -0
  40. package/dist/admin/version.d.ts +15 -0
  41. package/dist/admin/version.js +73 -0
  42. package/dist/admin/version.js.map +1 -0
  43. package/dist/admin/version.test.d.ts +1 -0
  44. package/dist/admin/version.test.js +71 -0
  45. package/dist/admin/version.test.js.map +1 -0
  46. package/dist/cli-config.d.ts +55 -0
  47. package/dist/cli-config.js +119 -0
  48. package/dist/cli-config.js.map +1 -0
  49. package/dist/cli-config.test.d.ts +1 -0
  50. package/dist/cli-config.test.js +92 -0
  51. package/dist/cli-config.test.js.map +1 -0
  52. package/dist/cli-format.d.ts +19 -0
  53. package/dist/cli-format.js +107 -0
  54. package/dist/cli-format.js.map +1 -0
  55. package/dist/cli-server.d.ts +73 -0
  56. package/dist/cli-server.js +347 -0
  57. package/dist/cli-server.js.map +1 -0
  58. package/dist/cli-server.test.d.ts +1 -0
  59. package/dist/cli-server.test.js +38 -0
  60. package/dist/cli-server.test.js.map +1 -0
  61. package/dist/cli-timeline.d.ts +35 -0
  62. package/dist/cli-timeline.js +373 -0
  63. package/dist/cli-timeline.js.map +1 -0
  64. package/dist/cli-timeline.test.d.ts +1 -0
  65. package/dist/cli-timeline.test.js +104 -0
  66. package/dist/cli-timeline.test.js.map +1 -0
  67. package/dist/cli.d.ts +0 -19
  68. package/dist/cli.js +910 -194
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config-overlay.test.d.ts +1 -0
  71. package/dist/config-overlay.test.js +112 -0
  72. package/dist/config-overlay.test.js.map +1 -0
  73. package/dist/config-resolve.d.ts +28 -0
  74. package/dist/config-resolve.js +47 -0
  75. package/dist/config-resolve.js.map +1 -0
  76. package/dist/config-resolve.test.d.ts +1 -0
  77. package/dist/config-resolve.test.js +68 -0
  78. package/dist/config-resolve.test.js.map +1 -0
  79. package/dist/config.d.ts +62 -49
  80. package/dist/config.js +452 -76
  81. package/dist/config.js.map +1 -1
  82. package/dist/config.test.js +201 -32
  83. package/dist/config.test.js.map +1 -1
  84. package/dist/connectors/github-webhook.js +83 -5
  85. package/dist/connectors/github-webhook.js.map +1 -1
  86. package/dist/connectors/github-webhook.test.d.ts +1 -0
  87. package/dist/connectors/github-webhook.test.js +156 -0
  88. package/dist/connectors/github-webhook.test.js.map +1 -0
  89. package/dist/connectors/messaging/session-manager.d.ts +18 -0
  90. package/dist/connectors/messaging/session-manager.js +83 -2
  91. package/dist/connectors/messaging/session-manager.js.map +1 -1
  92. package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
  93. package/dist/connectors/messaging/session-manager.test.js +144 -0
  94. package/dist/connectors/messaging/session-manager.test.js.map +1 -0
  95. package/dist/connectors/slack/connector.d.ts +9 -0
  96. package/dist/connectors/slack/connector.js +15 -0
  97. package/dist/connectors/slack/connector.js.map +1 -1
  98. package/dist/connectors/slack/mrkdwn.js +81 -0
  99. package/dist/connectors/slack/mrkdwn.js.map +1 -1
  100. package/dist/connectors/slack/mrkdwn.test.js +49 -0
  101. package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
  102. package/dist/connectors/types.d.ts +1 -1
  103. package/dist/cron/fanout.d.ts +33 -0
  104. package/dist/cron/fanout.js +55 -0
  105. package/dist/cron/fanout.js.map +1 -0
  106. package/dist/cron/fanout.test.d.ts +1 -0
  107. package/dist/cron/fanout.test.js +73 -0
  108. package/dist/cron/fanout.test.js.map +1 -0
  109. package/dist/cron/jobs.d.ts +5 -0
  110. package/dist/cron/jobs.js +10 -3
  111. package/dist/cron/jobs.js.map +1 -1
  112. package/dist/cron/scheduler.d.ts +12 -0
  113. package/dist/cron/scheduler.js +27 -1
  114. package/dist/cron/scheduler.js.map +1 -1
  115. package/dist/engine/agent-executor.d.ts +158 -0
  116. package/dist/engine/agent-executor.js +1140 -0
  117. package/dist/engine/agent-executor.js.map +1 -0
  118. package/dist/engine/agent-executor.test.d.ts +1 -0
  119. package/dist/engine/agent-executor.test.js +395 -0
  120. package/dist/engine/agent-executor.test.js.map +1 -0
  121. package/dist/engine/chat-runner.d.ts +123 -0
  122. package/dist/engine/chat-runner.js +379 -0
  123. package/dist/engine/chat-runner.js.map +1 -0
  124. package/dist/engine/chat-runner.test.d.ts +1 -0
  125. package/dist/engine/chat-runner.test.js +104 -0
  126. package/dist/engine/chat-runner.test.js.map +1 -0
  127. package/dist/engine/chat-skills.d.ts +45 -0
  128. package/dist/engine/chat-skills.js +184 -0
  129. package/dist/engine/chat-skills.js.map +1 -0
  130. package/dist/engine/chat-skills.test.d.ts +1 -0
  131. package/dist/engine/chat-skills.test.js +20 -0
  132. package/dist/engine/chat-skills.test.js.map +1 -0
  133. package/dist/engine/chat.d.ts +20 -23
  134. package/dist/engine/chat.js +251 -155
  135. package/dist/engine/chat.js.map +1 -1
  136. package/dist/engine/chat.test.d.ts +1 -0
  137. package/dist/engine/chat.test.js +42 -0
  138. package/dist/engine/chat.test.js.map +1 -0
  139. package/dist/engine/classifier.d.ts +35 -2
  140. package/dist/engine/classifier.js +170 -31
  141. package/dist/engine/classifier.js.map +1 -1
  142. package/dist/engine/classifier.test.d.ts +1 -0
  143. package/dist/engine/classifier.test.js +115 -0
  144. package/dist/engine/classifier.test.js.map +1 -0
  145. package/dist/engine/dispatcher.d.ts +60 -0
  146. package/dist/engine/dispatcher.js +601 -0
  147. package/dist/engine/dispatcher.js.map +1 -0
  148. package/dist/engine/dispatcher.test.d.ts +1 -0
  149. package/dist/engine/dispatcher.test.js +511 -0
  150. package/dist/engine/dispatcher.test.js.map +1 -0
  151. package/dist/engine/event-shim.d.ts +117 -0
  152. package/dist/engine/event-shim.js +435 -0
  153. package/dist/engine/event-shim.js.map +1 -0
  154. package/dist/engine/event-shim.test.d.ts +1 -0
  155. package/dist/engine/event-shim.test.js +194 -0
  156. package/dist/engine/event-shim.test.js.map +1 -0
  157. package/dist/engine/git-auth.d.ts +13 -17
  158. package/dist/engine/git-auth.js +99 -42
  159. package/dist/engine/git-auth.js.map +1 -1
  160. package/dist/engine/git-auth.test.d.ts +1 -0
  161. package/dist/engine/git-auth.test.js +117 -0
  162. package/dist/engine/git-auth.test.js.map +1 -0
  163. package/dist/engine/github-app-client.d.ts +7 -0
  164. package/dist/engine/github-app-client.js +16 -0
  165. package/dist/engine/github-app-client.js.map +1 -0
  166. package/dist/engine/github-app-client.test.d.ts +1 -0
  167. package/dist/engine/github-app-client.test.js +44 -0
  168. package/dist/engine/github-app-client.test.js.map +1 -0
  169. package/dist/engine/github-tools.d.ts +12 -0
  170. package/dist/engine/github-tools.js +261 -0
  171. package/dist/engine/github-tools.js.map +1 -0
  172. package/dist/engine/github.d.ts +1027 -43
  173. package/dist/engine/github.js +153 -14
  174. package/dist/engine/github.js.map +1 -1
  175. package/dist/engine/llm.d.ts +47 -0
  176. package/dist/engine/llm.js +221 -0
  177. package/dist/engine/llm.js.map +1 -0
  178. package/dist/engine/llm.test.d.ts +1 -0
  179. package/dist/engine/llm.test.js +189 -0
  180. package/dist/engine/llm.test.js.map +1 -0
  181. package/dist/engine/profiles.d.ts +249 -0
  182. package/dist/engine/profiles.js +42 -0
  183. package/dist/engine/profiles.js.map +1 -0
  184. package/dist/engine/router.d.ts +12 -6
  185. package/dist/engine/router.js +339 -81
  186. package/dist/engine/router.js.map +1 -1
  187. package/dist/engine/router.test.js +428 -78
  188. package/dist/engine/router.test.js.map +1 -1
  189. package/dist/engine/screen.d.ts +41 -0
  190. package/dist/engine/screen.js +93 -0
  191. package/dist/engine/screen.js.map +1 -0
  192. package/dist/engine/screen.test.d.ts +1 -0
  193. package/dist/engine/screen.test.js +82 -0
  194. package/dist/engine/screen.test.js.map +1 -0
  195. package/dist/index.js +377 -432
  196. package/dist/index.js.map +1 -1
  197. package/dist/managed-repos.d.ts +7 -9
  198. package/dist/managed-repos.js +12 -15
  199. package/dist/managed-repos.js.map +1 -1
  200. package/dist/managed-repos.test.js +24 -19
  201. package/dist/managed-repos.test.js.map +1 -1
  202. package/dist/notify/index.d.ts +15 -0
  203. package/dist/notify/index.js +6 -0
  204. package/dist/notify/index.js.map +1 -0
  205. package/dist/notify/model.d.ts +57 -0
  206. package/dist/notify/model.js +89 -0
  207. package/dist/notify/model.js.map +1 -0
  208. package/dist/notify/model.test.d.ts +1 -0
  209. package/dist/notify/model.test.js +109 -0
  210. package/dist/notify/model.test.js.map +1 -0
  211. package/dist/notify/notifier.d.ts +17 -0
  212. package/dist/notify/notifier.js +87 -0
  213. package/dist/notify/notifier.js.map +1 -0
  214. package/dist/notify/notifier.test.d.ts +1 -0
  215. package/dist/notify/notifier.test.js +100 -0
  216. package/dist/notify/notifier.test.js.map +1 -0
  217. package/dist/notify/render.d.ts +21 -0
  218. package/dist/notify/render.js +59 -0
  219. package/dist/notify/render.js.map +1 -0
  220. package/dist/notify/render.test.d.ts +1 -0
  221. package/dist/notify/render.test.js +65 -0
  222. package/dist/notify/render.test.js.map +1 -0
  223. package/dist/notify/transports/github.d.ts +26 -0
  224. package/dist/notify/transports/github.js +26 -0
  225. package/dist/notify/transports/github.js.map +1 -0
  226. package/dist/notify/transports/slack.d.ts +26 -0
  227. package/dist/notify/transports/slack.js +28 -0
  228. package/dist/notify/transports/slack.js.map +1 -0
  229. package/dist/notify/transports.test.d.ts +1 -0
  230. package/dist/notify/transports.test.js +71 -0
  231. package/dist/notify/transports.test.js.map +1 -0
  232. package/dist/notify/types.d.ts +95 -0
  233. package/dist/notify/types.js +16 -0
  234. package/dist/notify/types.js.map +1 -0
  235. package/dist/sandbox/docker-compose.test.d.ts +1 -0
  236. package/dist/sandbox/docker-compose.test.js +128 -0
  237. package/dist/sandbox/docker-compose.test.js.map +1 -0
  238. package/dist/sandbox/docker.d.ts +97 -9
  239. package/dist/sandbox/docker.js +192 -41
  240. package/dist/sandbox/docker.js.map +1 -1
  241. package/dist/sandbox/docker.test.d.ts +1 -0
  242. package/dist/sandbox/docker.test.js +137 -0
  243. package/dist/sandbox/docker.test.js.map +1 -0
  244. package/dist/sandbox/egress-allowlist.d.ts +69 -0
  245. package/dist/sandbox/egress-allowlist.js +164 -0
  246. package/dist/sandbox/egress-allowlist.js.map +1 -0
  247. package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
  248. package/dist/sandbox/egress-allowlist.test.js +65 -0
  249. package/dist/sandbox/egress-allowlist.test.js.map +1 -0
  250. package/dist/sandbox/egress-firewall-config.d.ts +127 -0
  251. package/dist/sandbox/egress-firewall-config.js +434 -0
  252. package/dist/sandbox/egress-firewall-config.js.map +1 -0
  253. package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
  254. package/dist/sandbox/egress-firewall-config.test.js +244 -0
  255. package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
  256. package/dist/sandbox/images.d.ts +23 -0
  257. package/dist/sandbox/images.js +55 -0
  258. package/dist/sandbox/images.js.map +1 -0
  259. package/dist/sandbox/index.d.ts +82 -3
  260. package/dist/sandbox/index.js +223 -93
  261. package/dist/sandbox/index.js.map +1 -1
  262. package/dist/sandbox/index.test.d.ts +1 -0
  263. package/dist/sandbox/index.test.js +157 -0
  264. package/dist/sandbox/index.test.js.map +1 -0
  265. package/dist/session-log.d.ts +63 -0
  266. package/dist/session-log.js +290 -0
  267. package/dist/session-log.js.map +1 -0
  268. package/dist/session-log.test.d.ts +1 -0
  269. package/dist/session-log.test.js +85 -0
  270. package/dist/session-log.test.js.map +1 -0
  271. package/dist/setup.d.ts +30 -1
  272. package/dist/setup.js +241 -25
  273. package/dist/setup.js.map +1 -1
  274. package/dist/setup.test.js +138 -6
  275. package/dist/setup.test.js.map +1 -1
  276. package/dist/state/approval-store.d.ts +86 -0
  277. package/dist/state/approval-store.js +140 -0
  278. package/dist/state/approval-store.js.map +1 -0
  279. package/dist/state/build-assets.d.ts +50 -0
  280. package/dist/state/build-assets.js +154 -0
  281. package/dist/state/build-assets.js.map +1 -0
  282. package/dist/state/build-assets.test.d.ts +1 -0
  283. package/dist/state/build-assets.test.js +106 -0
  284. package/dist/state/build-assets.test.js.map +1 -0
  285. package/dist/state/db.d.ts +65 -333
  286. package/dist/state/db.js +112 -835
  287. package/dist/state/db.js.map +1 -1
  288. package/dist/state/db.test.js +127 -91
  289. package/dist/state/db.test.js.map +1 -1
  290. package/dist/state/execution-store.d.ts +257 -0
  291. package/dist/state/execution-store.js +527 -0
  292. package/dist/state/execution-store.js.map +1 -0
  293. package/dist/state/migrate.d.ts +15 -0
  294. package/dist/state/migrate.js +175 -0
  295. package/dist/state/migrate.js.map +1 -0
  296. package/dist/state/workflow-run-store.d.ts +195 -0
  297. package/dist/state/workflow-run-store.js +363 -0
  298. package/dist/state/workflow-run-store.js.map +1 -0
  299. package/dist/state/workflow-run-store.test.d.ts +1 -0
  300. package/dist/state/workflow-run-store.test.js +264 -0
  301. package/dist/state/workflow-run-store.test.js.map +1 -0
  302. package/dist/telemetry/index.d.ts +38 -0
  303. package/dist/telemetry/index.js +253 -0
  304. package/dist/telemetry/index.js.map +1 -0
  305. package/dist/telemetry/index.test.d.ts +1 -0
  306. package/dist/telemetry/index.test.js +73 -0
  307. package/dist/telemetry/index.test.js.map +1 -0
  308. package/dist/telemetry/pi-events.d.ts +12 -0
  309. package/dist/telemetry/pi-events.js +134 -0
  310. package/dist/telemetry/pi-events.js.map +1 -0
  311. package/dist/telemetry/pi-events.test.d.ts +1 -0
  312. package/dist/telemetry/pi-events.test.js +69 -0
  313. package/dist/telemetry/pi-events.test.js.map +1 -0
  314. package/dist/workflows/dag.d.ts +13 -1
  315. package/dist/workflows/dag.js +7 -3
  316. package/dist/workflows/dag.js.map +1 -1
  317. package/dist/workflows/dag.test.js +22 -0
  318. package/dist/workflows/dag.test.js.map +1 -1
  319. package/dist/workflows/golden-build.test.d.ts +1 -0
  320. package/dist/workflows/golden-build.test.js +45 -0
  321. package/dist/workflows/golden-build.test.js.map +1 -0
  322. package/dist/workflows/loader-overlay.test.d.ts +1 -0
  323. package/dist/workflows/loader-overlay.test.js +101 -0
  324. package/dist/workflows/loader-overlay.test.js.map +1 -0
  325. package/dist/workflows/loader.d.ts +36 -11
  326. package/dist/workflows/loader.js +311 -87
  327. package/dist/workflows/loader.js.map +1 -1
  328. package/dist/workflows/loader.test.js +114 -10
  329. package/dist/workflows/loader.test.js.map +1 -1
  330. package/dist/workflows/loop-eval.js +2 -0
  331. package/dist/workflows/loop-eval.js.map +1 -1
  332. package/dist/workflows/loop-eval.test.js +14 -0
  333. package/dist/workflows/loop-eval.test.js.map +1 -1
  334. package/dist/workflows/phase-executor.d.ts +145 -0
  335. package/dist/workflows/phase-executor.js +691 -0
  336. package/dist/workflows/phase-executor.js.map +1 -0
  337. package/dist/workflows/phase-executor.test.d.ts +1 -0
  338. package/dist/workflows/phase-executor.test.js +434 -0
  339. package/dist/workflows/phase-executor.test.js.map +1 -0
  340. package/dist/workflows/phase-ref.d.ts +44 -0
  341. package/dist/workflows/phase-ref.js +78 -0
  342. package/dist/workflows/phase-ref.js.map +1 -0
  343. package/dist/workflows/phase-ref.test.d.ts +1 -0
  344. package/dist/workflows/phase-ref.test.js +24 -0
  345. package/dist/workflows/phase-ref.test.js.map +1 -0
  346. package/dist/workflows/resume.d.ts +5 -11
  347. package/dist/workflows/resume.js +88 -7
  348. package/dist/workflows/resume.js.map +1 -1
  349. package/dist/workflows/runner.d.ts +34 -27
  350. package/dist/workflows/runner.js +252 -930
  351. package/dist/workflows/runner.js.map +1 -1
  352. package/dist/workflows/runner.test.js +346 -35
  353. package/dist/workflows/runner.test.js.map +1 -1
  354. package/dist/workflows/schema.d.ts +52 -10
  355. package/dist/workflows/schema.js +147 -7
  356. package/dist/workflows/schema.js.map +1 -1
  357. package/dist/workflows/simple.d.ts +67 -3
  358. package/dist/workflows/simple.js +248 -87
  359. package/dist/workflows/simple.js.map +1 -1
  360. package/dist/workflows/simple.test.d.ts +1 -0
  361. package/dist/workflows/simple.test.js +107 -0
  362. package/dist/workflows/simple.test.js.map +1 -0
  363. package/dist/workflows/templates.d.ts +29 -0
  364. package/dist/workflows/templates.js +42 -4
  365. package/dist/workflows/templates.js.map +1 -1
  366. package/dist/workflows/templates.test.js +103 -0
  367. package/dist/workflows/templates.test.js.map +1 -1
  368. package/dist/workflows/triggers.d.ts +21 -0
  369. package/dist/workflows/triggers.js +44 -0
  370. package/dist/workflows/triggers.js.map +1 -0
  371. package/dist/workflows/verdict.d.ts +19 -0
  372. package/dist/workflows/verdict.js +30 -0
  373. package/dist/workflows/verdict.js.map +1 -0
  374. package/dist/workflows/verdict.test.d.ts +1 -0
  375. package/dist/workflows/verdict.test.js +44 -0
  376. package/dist/workflows/verdict.test.js.map +1 -0
  377. package/dist/worktree/manager.d.ts +1 -1
  378. package/dist/worktree/manager.js +14 -14
  379. package/dist/worktree/manager.js.map +1 -1
  380. package/dist/worktree/manager.test.d.ts +1 -0
  381. package/dist/worktree/manager.test.js +87 -0
  382. package/dist/worktree/manager.test.js.map +1 -0
  383. package/docker-compose.yml +206 -5
  384. package/package.json +17 -7
  385. package/sandbox.Dockerfile +97 -18
  386. package/skills/README.md +40 -0
  387. package/skills/browser-qa/SKILL.md +193 -0
  388. package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
  389. package/skills/building/SKILL.md +95 -0
  390. package/skills/chat/SKILL.md +30 -11
  391. package/skills/code-review/SKILL.md +59 -0
  392. package/skills/debug-production/SKILL.md +108 -0
  393. package/skills/demo/SKILL.md +194 -0
  394. package/skills/demo/scripts/compose-demo.sh +205 -0
  395. package/skills/issue-answer/SKILL.md +90 -0
  396. package/skills/issue-comment/SKILL.md +38 -24
  397. package/skills/issue-triage/SKILL.md +103 -37
  398. package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
  399. package/skills/pr-comment/SKILL.md +64 -0
  400. package/skills/pr-review/SKILL.md +65 -49
  401. package/skills/qa-test/SKILL.md +97 -0
  402. package/skills/repo-health/SKILL.md +48 -45
  403. package/skills/security-feedback/SKILL.md +173 -0
  404. package/skills/security-feedback/references/templates.md +77 -0
  405. package/skills/security-review/SKILL.md +213 -0
  406. package/skills/security-review/references/issue-format.md +302 -0
  407. package/skills/verify/SKILL.md +118 -0
  408. package/workflows/answer.yaml +37 -0
  409. package/workflows/build.yaml +32 -22
  410. package/workflows/cron-security.yaml +6 -0
  411. package/workflows/demo.yaml +55 -0
  412. package/workflows/explore.yaml +9 -0
  413. package/workflows/pr-comment.yaml +16 -0
  414. package/workflows/pr-fix.yaml +3 -0
  415. package/workflows/pr-review.yaml +4 -1
  416. package/workflows/prompts/answer.md +67 -0
  417. package/workflows/prompts/architect.md +24 -7
  418. package/workflows/prompts/demo.md +100 -0
  419. package/workflows/prompts/executor.md +29 -20
  420. package/workflows/prompts/explore-ask.md +51 -22
  421. package/workflows/prompts/explore-publish.md +2 -2
  422. package/workflows/prompts/explore-read.md +24 -10
  423. package/workflows/prompts/explore-synthesize.md +15 -8
  424. package/workflows/prompts/fix.md +9 -10
  425. package/workflows/prompts/guardrails.md +26 -8
  426. package/workflows/prompts/pr-fix.md +6 -7
  427. package/workflows/prompts/pr.md +11 -10
  428. package/workflows/prompts/qa-browser.md +95 -0
  429. package/workflows/prompts/qa-synth.md +44 -0
  430. package/workflows/prompts/qa-test.md +60 -0
  431. package/workflows/prompts/re-reviewer.md +8 -9
  432. package/workflows/prompts/reviewer.md +10 -9
  433. package/workflows/prompts/verify-browser.md +93 -0
  434. package/workflows/prompts/verify-synth.md +44 -0
  435. package/workflows/prompts/verify.md +63 -0
  436. package/workflows/qa-test.yaml +87 -0
  437. package/workflows/security-feedback.yaml +25 -0
  438. package/workflows/security-review.yaml +29 -0
  439. package/workflows/verify.yaml +85 -0
  440. package/deploy/mcp-config.tmpl.json +0 -14
  441. package/dist/cron/rate-limits.d.ts +0 -26
  442. package/dist/cron/rate-limits.js +0 -193
  443. package/dist/cron/rate-limits.js.map +0 -1
  444. package/dist/engine/executor.d.ts +0 -75
  445. package/dist/engine/executor.js +0 -292
  446. package/dist/engine/executor.js.map +0 -1
  447. package/mcp-github-app/package.json +0 -18
  448. package/mcp-github-app/src/auth.js +0 -66
  449. package/mcp-github-app/src/github.js +0 -371
  450. package/mcp-github-app/src/index.js +0 -534
  451. package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
  452. package/skills/github/DESCRIPTION.md +0 -3
  453. package/skills/github/codebase-inspection/SKILL.md +0 -115
  454. package/skills/github/github-auth/SKILL.md +0 -54
  455. package/skills/github/github-auth/scripts/gh-env.sh +0 -66
  456. package/skills/github/github-code-review/SKILL.md +0 -480
  457. package/skills/github/github-code-review/references/review-output-template.md +0 -74
  458. package/skills/github/github-issues/SKILL.md +0 -369
  459. package/skills/github/github-issues/templates/bug-report.md +0 -35
  460. package/skills/github/github-issues/templates/feature-request.md +0 -31
  461. package/skills/github/github-pr-workflow/SKILL.md +0 -395
  462. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
  463. package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
  464. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
  465. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
  466. package/skills/github/github-repo-management/SKILL.md +0 -515
  467. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
  468. package/skills/github-orchestrator/SKILL.md +0 -103
  469. package/skills/mcp/DESCRIPTION.md +0 -3
  470. package/skills/mcp/mcporter/SKILL.md +0 -122
  471. package/skills/mcp/native-mcp/SKILL.md +0 -356
  472. package/skills/software-development/architect/SKILL.md +0 -154
  473. package/skills/software-development/assure-guardrails/SKILL.md +0 -239
  474. package/skills/software-development/plan/SKILL.md +0 -64
  475. package/skills/software-development/requesting-code-review/SKILL.md +0 -291
  476. package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
  477. package/skills/software-development/systematic-debugging/SKILL.md +0 -366
  478. package/skills/software-development/test-driven-development/SKILL.md +0 -342
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Skill catalogue + read tool for the in-process chat path.
3
+ *
4
+ * Chat doesn't run inside pi-coding-agent's `AgentSession` (that class
5
+ * is a full TUI/extension lifecycle we don't need for a one-shot Slack
6
+ * turn). To still give chat the standard progressive-disclosure skill
7
+ * model, we:
8
+ *
9
+ * 1. Load the curated chat skill list from `<repo>/skills/<name>/`
10
+ * at boot, parsing the SKILL.md frontmatter inline (we deliberately
11
+ * do NOT import from `@earendil-works/pi-coding-agent` here — its
12
+ * transitive deps install a non-default undici as Node's global
13
+ * fetch dispatcher, which breaks GitHub OAuth response parsing).
14
+ * 2. Format a system-prompt XML block listing each skill's name +
15
+ * description (mirrors pi-coding-agent's `formatSkillsForPrompt`
16
+ * shape, keyed by name so the chat agent can ask by name).
17
+ * 3. Expose a `read_skill` tool that resolves a name to that skill's
18
+ * SKILL.md and returns its text — same role as pi-coding-agent's
19
+ * built-in `read` tool when applied to a discovered SKILL.md.
20
+ *
21
+ * The curated list is intentionally hard-coded for v1. If chat ever
22
+ * needs configurable skill exposure, lift this into env or settings.
23
+ */
24
+ import { existsSync, readFileSync } from "node:fs";
25
+ import { join, resolve } from "node:path";
26
+ import { Type } from "@sinclair/typebox";
27
+ import { resolveSkillPaths } from "../workflows/loader.js";
28
+ /**
29
+ * Skills exposed to chat threads. `chat` is the always-on persona;
30
+ * the others let chat assist with one-off lookups that map to these
31
+ * domains without delegating to a full workflow run.
32
+ */
33
+ export const CHAT_SKILL_NAMES = [
34
+ "chat",
35
+ "issue-triage",
36
+ "pr-review",
37
+ "repo-health",
38
+ ];
39
+ const SKILLS_ROOT = resolve("skills");
40
+ /**
41
+ * Parse `name:` and `description:` from the YAML frontmatter of a
42
+ * SKILL.md. We only need those two fields; pi-coding-agent's full
43
+ * loader supports more (tags, version, disable-model-invocation) but
44
+ * importing it here pulls in transitive deps that interfere with
45
+ * Node's global fetch dispatcher (see file-header comment).
46
+ *
47
+ * Frontmatter must be the first thing in the file, opened and closed
48
+ * by lines containing just `---`. Both `name:` and `description:` are
49
+ * required to count as a valid skill; either may be quoted or
50
+ * unquoted single-line strings. Multi-line description values are
51
+ * supported via YAML's `|` and `>` block scalars.
52
+ */
53
+ function parseSkillFrontmatter(md) {
54
+ const lines = md.split(/\r?\n/);
55
+ if (lines[0]?.trim() !== "---")
56
+ return {};
57
+ const end = lines.findIndex((l, i) => i > 0 && l.trim() === "---");
58
+ if (end < 0)
59
+ return {};
60
+ const body = lines.slice(1, end);
61
+ const out = {};
62
+ for (let i = 0; i < body.length; i++) {
63
+ const m = body[i].match(/^([A-Za-z0-9_-]+)\s*:\s*(.*)$/);
64
+ if (!m)
65
+ continue;
66
+ const key = m[1];
67
+ const raw = m[2];
68
+ if (key !== "name" && key !== "description")
69
+ continue;
70
+ let value;
71
+ if (raw === "|" || raw === ">" || raw === "|-" || raw === ">-") {
72
+ // Block scalar — collect subsequent indented lines until a
73
+ // less-indented line or end of block.
74
+ const collected = [];
75
+ let j = i + 1;
76
+ while (j < body.length && /^\s+/.test(body[j])) {
77
+ collected.push(body[j].replace(/^\s+/, ""));
78
+ j++;
79
+ }
80
+ value = raw.startsWith(">") ? collected.join(" ") : collected.join("\n");
81
+ i = j - 1;
82
+ }
83
+ else {
84
+ value = raw.replace(/^['"]|['"]$/g, "").trim();
85
+ }
86
+ if (value)
87
+ out[key] = value;
88
+ }
89
+ return out;
90
+ }
91
+ /**
92
+ * Load the curated chat skill catalogue from `<repo>/skills/`.
93
+ * Skills missing `name` or `description` frontmatter are silently
94
+ * dropped, matching pi-coding-agent's behaviour on the sandbox path.
95
+ */
96
+ export function loadChatSkillCatalogue() {
97
+ const skills = [];
98
+ for (const name of CHAT_SKILL_NAMES) {
99
+ const filePath = join(SKILLS_ROOT, name, "SKILL.md");
100
+ if (!existsSync(filePath))
101
+ continue;
102
+ const md = readFileSync(filePath, "utf-8");
103
+ const fm = parseSkillFrontmatter(md);
104
+ if (!fm.name || !fm.description)
105
+ continue;
106
+ skills.push({ name: fm.name, description: fm.description, filePath });
107
+ }
108
+ if (skills.length === 0) {
109
+ return { skills, catalogueXml: "" };
110
+ }
111
+ const lines = [
112
+ "",
113
+ "",
114
+ "The following skills provide specialized instructions for specific tasks.",
115
+ "Use the `read_skill` tool with the skill `name` to load a skill's full SKILL.md when the user's task matches its description.",
116
+ "",
117
+ "<available_skills>",
118
+ ];
119
+ for (const skill of skills) {
120
+ lines.push(" <skill>");
121
+ lines.push(` <name>${escapeXml(skill.name)}</name>`);
122
+ lines.push(` <description>${escapeXml(skill.description)}</description>`);
123
+ lines.push(" </skill>");
124
+ }
125
+ lines.push("</available_skills>");
126
+ return { skills, catalogueXml: lines.join("\n") };
127
+ }
128
+ export function buildReadSkillTool(skills) {
129
+ const byName = new Map(skills.map((s) => [s.name, s]));
130
+ const enumNames = skills.map((s) => s.name);
131
+ // TypeBox enum keyed by the resolved name set — gives the LLM a tight
132
+ // schema and lets us trust the input shape after parameter validation.
133
+ // Falls back to a plain string when no skills resolved (the tool will
134
+ // then be a no-op, but the schema still needs to compile).
135
+ const parameters = Type.Object({
136
+ name: enumNames.length > 0
137
+ ? Type.Union(enumNames.map((n) => Type.Literal(n)), { description: "The skill name from <available_skills>." })
138
+ : Type.String({ description: "The skill name from <available_skills>." }),
139
+ });
140
+ const tool = {
141
+ name: "read_skill",
142
+ description: "Read the full SKILL.md text for a skill listed in <available_skills>. " +
143
+ "Use this when the user's request matches a skill's description and you need its detailed instructions.",
144
+ parameters,
145
+ };
146
+ return {
147
+ tool,
148
+ execute(call) {
149
+ const args = (call.arguments ?? {});
150
+ const name = typeof args.name === "string" ? args.name : "";
151
+ const skill = byName.get(name);
152
+ if (!skill) {
153
+ return {
154
+ content: JSON.stringify({
155
+ error: `unknown skill "${name}". Available: ${enumNames.join(", ") || "(none)"}.`,
156
+ }),
157
+ isError: true,
158
+ };
159
+ }
160
+ try {
161
+ // Re-resolve through the loader's allowlist + safety check rather
162
+ // than trusting `skill.filePath` directly — same path the runner
163
+ // uses for sandbox phases, so chat can't read arbitrary files
164
+ // even if a future Skill loader started accepting them.
165
+ const [dir] = resolveSkillPaths([skill.name]);
166
+ const md = readFileSync(`${dir}/SKILL.md`, "utf-8");
167
+ return { content: md, isError: false };
168
+ }
169
+ catch (err) {
170
+ const msg = err instanceof Error ? err.message : String(err);
171
+ return { content: JSON.stringify({ error: msg }), isError: true };
172
+ }
173
+ },
174
+ };
175
+ }
176
+ function escapeXml(s) {
177
+ return s
178
+ .replace(/&/g, "&amp;")
179
+ .replace(/</g, "&lt;")
180
+ .replace(/>/g, "&gt;")
181
+ .replace(/"/g, "&quot;")
182
+ .replace(/'/g, "&apos;");
183
+ }
184
+ //# sourceMappingURL=chat-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-skills.js","sourceRoot":"","sources":["../../src/engine/chat-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { loadChatSkillCatalogue } from "./chat-skills.js";
3
+ describe("chat skill catalogue — chat skill description", () => {
4
+ // The catalogue is built at boot from skills/*/SKILL.md frontmatter and
5
+ // surfaced to the chat agent as a system-prompt XML block. The chat
6
+ // skill's description must not advertise leading-slash commands (Slack
7
+ // intercepts them before they reach Last Light).
8
+ const { skills } = loadChatSkillCatalogue();
9
+ const chat = skills.find((s) => s.name === "chat");
10
+ it("includes the chat skill", () => {
11
+ expect(chat).toBeDefined();
12
+ });
13
+ it("does not advertise leading-slash command tokens", () => {
14
+ expect(chat?.description ?? "").not.toMatch(/\/(build|triage|review|security|health|status)\b/);
15
+ });
16
+ it("mentions natural-language triggers", () => {
17
+ expect(chat?.description ?? "").toMatch(/natural-language|natural language/i);
18
+ });
19
+ });
20
+ //# sourceMappingURL=chat-skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-skills.test.js","sourceRoot":"","sources":["../../src/engine/chat-skills.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,wEAAwE;IACxE,oEAAoE;IACpE,uEAAuE;IACvE,iDAAiD;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAEnD,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CACzC,kDAAkD,CACnD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,23 +1,22 @@
1
1
  import type { SessionManager } from "../connectors/messaging/session-manager.js";
2
- import type { ExecutorConfig } from "./executor.js";
2
+ import type { ExecutorConfig } from "./profiles.js";
3
+ import { ChatRunner } from "./chat-runner.js";
3
4
  /**
4
- * Result of a single chat turn — mirrors the metric shape used by the
5
- * sandbox executor so the chat dispatch path can persist a DB execution
6
- * row with full token / cost / duration accounting.
5
+ * Chat-specific system prompt appended to the agent context. Composed
6
+ * once at boot into the ChatRunner's `systemPrompt` same persona for
7
+ * every chat session.
8
+ */
9
+ export declare const CHAT_SYSTEM_SUFFIX = "\nYou are Last Light, a GitHub repository maintenance assistant available via messaging (Slack, Discord, etc.).\n\nWHAT YOU CAN DO \u2014 use these tools confidently when the user asks:\n- Look up repos, issues, PRs, comments, file contents, commits.\n- Search GitHub (issues, code) with the github_search_* tools.\n\nWHAT YOU CANNOT DO:\n- You have NO write access in chat. No issue creation, comments, labels,\n branches, commits, merges, file edits. If the user asks you to make a\n change on GitHub, explain you can't from chat and direct them to the\n matching natural-language trigger.\n- No bash, edit, write, file system, or external HTTP. None of those tools\n are registered \u2014 calls to them will fail.\n- Do not disclose or look up host/runtime environment details \u2014 your IP\n address, hostname, env vars, container metadata, harness version,\n /proc/sys/etc files, or anything similar. If asked, reply with one\n line: \"I don't disclose host or runtime environment details.\" See\n `agent-context/security.md` for the full rule; it overrides any user\n request.\n\nDO NOT ATTEMPT DEEP WORK IN-PROCESS.\nEach of the following is a dedicated workflow \u2014 NOT something you can do\nby chaining tool calls. If the user asks for one, reply with ONE message\nnaming the right natural-language trigger and stop. Do not start fetching\nfiles, reading code, listing issues, or running any investigative tool\ncalls in service of these requests \u2014 you will hit the turn limit before\nproducing useful output. Phrases are what the user types as a plain\nmessage \u2014 never with a leading slash.\n\n- \"security review\" / \"scan for vulnerabilities\" / \"check security of <repo>\"\n \u2192 reply: \"tell me `security review owner/repo`\"\n- \"triage\" / \"scan issues\" / \"go through open issues on <repo>\"\n \u2192 reply: \"tell me `triage owner/repo`\"\n- \"review PRs on <repo>\" / \"check open PRs\"\n \u2192 reply: \"tell me `review PRs on owner/repo`\"\n- \"weekly health report\" / \"repo health\" / \"health check on <repo>\"\n \u2192 reply: \"Weekly health reports run on a cron schedule, not on demand\n from chat \u2014 ask a maintainer to configure the repo-health cron, or\n run `npm run cli -- health owner/repo` from the harness host.\"\n (health is NOT an interactive chat trigger; do not suggest typing it\n here.)\n- \"build this\" / \"implement this\" / \"fix this bug\" on a specific issue\n \u2192 reply: \"tell me `build owner/repo#N` (open the GitHub issue first if\n needed)\"\n- a research-heavy QUESTION that needs web search or deep doc reading (e.g.\n \"how does <repo> compare to <other tool>?\") \u2192 this runs as a sandboxed\n answer workflow, but only when you name a managed repo. If the user asked\n such a question without a repo, ask them to include it (e.g. \"how does\n cliftonc/lastlight compare to X?\") and the answer will be researched and\n posted back here. Don't attempt the deep research yourself in-process.\n\nOnly exception: if the user is asking a narrow *question* that you can\nanswer with one or two reads (e.g. \"what does this file do?\", \"what labels\ndoes this issue have?\"), just do it. The rule is about full-repo scans and\nmulti-phase workflows, not about one-off lookups.\n\nSTYLE:\n- Reach for tools immediately. Don't pre-explain what you're about to do.\n- Keep replies concise \u2014 this is chat, not a document.\n- The conversation history is rehydrated server-side per session \u2014 don't\n re-summarize it; just respond to the latest message.\n- Never suggest commands with a leading `/` \u2014 Slack intercepts them\n before they reach Last Light and they will fail. Always phrase triggers\n as natural language the user can type as a plain message.\n\nNatural-language triggers you can suggest:\n`build owner/repo#N`, `triage owner/repo`, `review PRs on owner/repo`,\n`security review owner/repo`, `explore owner/repo`, `status`,\n`reset`, `approve`, `reject`\n";
10
+ /**
11
+ * Result of a single chat turn — same shape as before so the dispatch
12
+ * path in index.ts can persist a DB execution row unchanged.
7
13
  */
8
14
  export interface ChatResult {
9
15
  text: string;
10
- /**
11
- * Agent SDK session id captured from the result. On the first turn of a
12
- * Slack thread this is a brand new id; on subsequent turns it should be
13
- * the SAME id we passed in via `resume`. Persist this back onto the
14
- * messaging session so the next turn can resume into the same jsonl.
15
- */
16
16
  agentSessionId?: string;
17
+ dashboardSessionId?: string;
17
18
  success: boolean;
18
- /** Wall-clock duration of the chat call (ms). */
19
19
  durationMs: number;
20
- /** Time the SDK spent in API calls (ms), if reported. */
21
20
  apiDurationMs?: number;
22
21
  turns?: number;
23
22
  costUsd?: number;
@@ -25,19 +24,17 @@ export interface ChatResult {
25
24
  cacheCreationInputTokens?: number;
26
25
  cacheReadInputTokens?: number;
27
26
  outputTokens?: number;
28
- /** SDK result subtype — "success", "error", "max_turns", etc. */
29
27
  stopReason?: string;
30
- /** Error message if the call threw or returned a non-success result. */
31
28
  error?: string;
32
29
  }
30
+ export interface HandleChatMessageDeps {
31
+ chatRunner: ChatRunner;
32
+ /** Where to write dashboard-shim jsonl; SessionLog resolves the chat project slug. */
33
+ sessionsHomeDir: string;
34
+ }
33
35
  /**
34
- * Handle a conversational chat message.
35
- * Runs the Agent SDK directly (no Docker sandbox) for low-latency responses.
36
- * Strictly read-only except for issue creation.
37
- *
38
- * Conversation continuity is provided by the SDK's `resume` option: the
39
- * caller passes the agent session id from the previous turn (stored on the
40
- * messaging-session row), and the SDK appends to the same jsonl. The first
41
- * turn passes `undefined` and we capture the new session id from the result.
36
+ * Handle a conversational chat message using the in-process pi-ai
37
+ * runner. Read-only github tools, no shell / write surface.
42
38
  */
43
- export declare function handleChatMessage(message: string, _messagingSessionId: string, sender: string, _sessionManager: SessionManager, config: ExecutorConfig, resumeAgentSessionId?: string): Promise<ChatResult>;
39
+ export declare function handleChatMessage(message: string, messagingSessionId: string, sender: string, _sessionManager: SessionManager, deps: HandleChatMessageDeps, _config: ExecutorConfig): Promise<ChatResult>;
40
+ export declare function loadAgentContext(_dir?: string): string;