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,194 @@
1
+ import { describe, it, expect, afterEach } from "vitest";
2
+ import { promises as fs } from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { SessionLog, projectSlugForCwd } from "../session-log.js";
6
+ import { AgenticShim } from "./event-shim.js";
7
+ const tmpDirs = [];
8
+ afterEach(async () => {
9
+ for (const d of tmpDirs.splice(0)) {
10
+ await fs.rm(d, { recursive: true, force: true });
11
+ }
12
+ });
13
+ async function makeShim(initialPrompt = "do the thing") {
14
+ const homeDir = await fs.mkdtemp(path.join(os.tmpdir(), "shim-test-"));
15
+ tmpDirs.push(homeDir);
16
+ const cwd = "/home/agent/workspace";
17
+ const projectSlug = projectSlugForCwd(cwd);
18
+ const shim = new AgenticShim({
19
+ homeDir,
20
+ projectSlug,
21
+ model: "openai/gpt-5.5",
22
+ initialPrompt,
23
+ });
24
+ const filePath = new SessionLog(homeDir).pathForProject(projectSlug, "sess1", { requireExists: false });
25
+ if (!filePath)
26
+ throw new Error("expected valid session path");
27
+ return { shim, filePath };
28
+ }
29
+ async function readEnvelopes(filePath) {
30
+ const raw = await fs.readFile(filePath, "utf8");
31
+ return raw
32
+ .split("\n")
33
+ .filter((l) => l.trim().length > 0)
34
+ .map((l) => JSON.parse(l));
35
+ }
36
+ describe("AgenticShim per-message usage", () => {
37
+ it("writes Claude-shaped usage onto the assistant envelope", async () => {
38
+ const { shim, filePath } = await makeShim();
39
+ shim.feed({ type: "session", id: "sess1" });
40
+ shim.feed({
41
+ type: "message_end",
42
+ sessionId: "sess1",
43
+ message: {
44
+ role: "assistant",
45
+ content: [{ type: "text", text: "hello" }],
46
+ usage: {
47
+ input: 1200,
48
+ output: 340,
49
+ cacheRead: 5000,
50
+ cacheWrite: 10,
51
+ cost: { total: 0.07 },
52
+ },
53
+ },
54
+ });
55
+ await shim.flush();
56
+ const envelopes = await readEnvelopes(filePath);
57
+ const assistant = envelopes.find((e) => e.type === "assistant");
58
+ expect(assistant).toBeDefined();
59
+ const message = assistant?.message;
60
+ expect(message.usage).toEqual({
61
+ input_tokens: 1200,
62
+ output_tokens: 340,
63
+ cache_read_input_tokens: 5000,
64
+ cache_creation_input_tokens: 10,
65
+ });
66
+ });
67
+ it("writes an extension_status event as a system envelope line", async () => {
68
+ const { shim, filePath } = await makeShim();
69
+ shim.feed({ type: "session", id: "sess1" });
70
+ shim.feed({
71
+ type: "extension_status",
72
+ sessionId: "sess1",
73
+ extension: "file-search",
74
+ status: "configured",
75
+ mode: "override",
76
+ toolCount: 3,
77
+ });
78
+ await shim.flush();
79
+ const envelopes = await readEnvelopes(filePath);
80
+ const sys = envelopes.find((e) => e.type === "system" && e.subtype === "extension_status");
81
+ expect(sys).toBeDefined();
82
+ expect(sys).toMatchObject({
83
+ extension: "file-search",
84
+ status: "configured",
85
+ mode: "override",
86
+ toolCount: 3,
87
+ });
88
+ // The initial user (prompt) line precedes it — extension status lands near
89
+ // the top of the session log.
90
+ expect(envelopes[0]?.type).toBe("user");
91
+ });
92
+ it("omits the usage block when the message carries no usage", async () => {
93
+ const { shim, filePath } = await makeShim();
94
+ shim.feed({ type: "session", id: "sess1" });
95
+ shim.feed({
96
+ type: "message_end",
97
+ sessionId: "sess1",
98
+ message: { role: "assistant", content: [{ type: "text", text: "hi" }] },
99
+ });
100
+ await shim.flush();
101
+ const envelopes = await readEnvelopes(filePath);
102
+ const assistant = envelopes.find((e) => e.type === "assistant");
103
+ const message = assistant?.message;
104
+ expect(message.usage).toBeUndefined();
105
+ });
106
+ });
107
+ describe("AgenticShim thinking blocks", () => {
108
+ it("preserves thinking blocks on the assistant envelope and the reader extracts reasoning", async () => {
109
+ const { shim, filePath } = await makeShim();
110
+ shim.feed({ type: "session", id: "sess1" });
111
+ shim.feed({
112
+ type: "message_end",
113
+ sessionId: "sess1",
114
+ message: {
115
+ role: "assistant",
116
+ content: [
117
+ { type: "thinking", thinking: "Let me reason about this..." },
118
+ { type: "text", text: "Here is the answer." },
119
+ ],
120
+ },
121
+ });
122
+ await shim.flush();
123
+ const envelopes = await readEnvelopes(filePath);
124
+ const assistant = envelopes.find((e) => e.type === "assistant");
125
+ const content = (assistant?.message).content;
126
+ expect(content).toEqual([
127
+ { type: "thinking", thinking: "Let me reason about this..." },
128
+ { type: "text", text: "Here is the answer." },
129
+ ]);
130
+ // Round-trip through the reader the dashboard uses: reasoning is surfaced.
131
+ const normalized = await new SessionLog("").readNormalizedFile(filePath);
132
+ const asst = normalized.find((n) => n.msg.role === "assistant");
133
+ expect(asst?.msg.reasoning).toBe("Let me reason about this...");
134
+ expect(asst?.msg.content).toBe("Here is the answer.");
135
+ });
136
+ it("skips empty/redacted thinking blocks", async () => {
137
+ const { shim, filePath } = await makeShim();
138
+ shim.feed({ type: "session", id: "sess1" });
139
+ shim.feed({
140
+ type: "message_end",
141
+ sessionId: "sess1",
142
+ message: {
143
+ role: "assistant",
144
+ content: [
145
+ { type: "thinking", thinking: "" },
146
+ { type: "text", text: "answer" },
147
+ ],
148
+ },
149
+ });
150
+ await shim.flush();
151
+ const envelopes = await readEnvelopes(filePath);
152
+ const assistant = envelopes.find((e) => e.type === "assistant");
153
+ const content = (assistant?.message).content;
154
+ expect(content).toEqual([{ type: "text", text: "answer" }]);
155
+ });
156
+ });
157
+ describe("AgenticShim auto-retry breadcrumbs", () => {
158
+ it("emits a renderable system line on auto_retry_start", async () => {
159
+ const { shim, filePath } = await makeShim();
160
+ shim.feed({ type: "session", id: "sess1" });
161
+ shim.feed({
162
+ type: "auto_retry_start",
163
+ sessionId: "sess1",
164
+ attempt: 1,
165
+ maxAttempts: 3,
166
+ delayMs: 10000,
167
+ errorMessage: "429 RATE_LIMIT_EXCEEDED",
168
+ });
169
+ await shim.flush();
170
+ const envelopes = await readEnvelopes(filePath);
171
+ const sys = envelopes.find((e) => e.role === "system" && e.subtype === "auto_retry_start");
172
+ expect(sys).toBeDefined();
173
+ expect(String(sys?.content)).toContain("Auto-retry 1/3 in 10s");
174
+ expect(String(sys?.content)).toContain("429 RATE_LIMIT_EXCEEDED");
175
+ // Role-based line renders as a system message in the timeline reader.
176
+ const normalized = await new SessionLog("").readNormalizedFile(filePath);
177
+ const sysMsg = normalized.find((n) => n.msg.role === "system");
178
+ expect(sysMsg?.msg.content).toContain("Auto-retry 1/3 in 10s");
179
+ });
180
+ it("distinguishes recovery from give-up on auto_retry_end", async () => {
181
+ const { shim, filePath } = await makeShim();
182
+ shim.feed({ type: "session", id: "sess1" });
183
+ shim.feed({ type: "auto_retry_end", sessionId: "sess1", attempt: 2 });
184
+ shim.feed({ type: "auto_retry_end", sessionId: "sess1", attempt: 3, finalError: "still 429" });
185
+ await shim.flush();
186
+ const envelopes = await readEnvelopes(filePath);
187
+ const ends = envelopes.filter((e) => e.role === "system" && e.subtype === "auto_retry_end");
188
+ expect(ends).toHaveLength(2);
189
+ expect(String(ends[0]?.content)).toContain("recovered after 2 attempt");
190
+ expect(String(ends[1]?.content)).toContain("gave up after 3 attempt");
191
+ expect(String(ends[1]?.content)).toContain("still 429");
192
+ });
193
+ });
194
+ //# sourceMappingURL=event-shim.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-shim.test.js","sourceRoot":"","sources":["../../src/engine/event-shim.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,OAAO,GAAa,EAAE,CAAC;AAE7B,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,QAAQ,CAAC,aAAa,GAAG,cAAc;IACpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,uBAAuB,CAAC;IACpC,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC;QAC3B,OAAO;QACP,WAAW;QACX,KAAK,EAAE,gBAAgB;QACvB,aAAa;KACd,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IACxG,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC,CAAC;AAC1D,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC1C,KAAK,EAAE;oBACL,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,GAAG;oBACX,SAAS,EAAE,IAAI;oBACf,UAAU,EAAE,EAAE;oBACd,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACtB;aACF;SACF,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,SAAS,EAAE,OAA6C,CAAC;QACzE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YAC5B,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,GAAG;YAClB,uBAAuB,EAAE,IAAI;YAC7B,2BAA2B,EAAE,EAAE;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAC/D,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;YACxB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,2EAA2E;QAC3E,8BAA8B;QAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;SACxE,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,SAAS,EAAE,OAA8B,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,6BAA6B,EAAE;oBAC7D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;iBAC9C;aACF;SACF,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,OAAuD,CAAA,CAAC,OAAO,CAAC;QAC5F,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,6BAA6B,EAAE;YAC7D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;SAC9C,CAAC,CAAC;QAEH,2EAA2E;QAC3E,MAAM,UAAU,GAAG,MAAM,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;oBAClC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACjC;aACF;SACF,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,OAAuD,CAAA,CAAC,OAAO,CAAC;QAC5F,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,yBAAyB;SACxC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAElE,sEAAsE;QACtE,MAAM,UAAU,GAAG,MAAM,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/F,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -10,19 +10,17 @@ export type GitHubTokenPermissions = Partial<{
10
10
  metadata: GitHubPermissionLevel;
11
11
  }>;
12
12
  /**
13
- * Configure git globally so that git clone/push/pull work with the
14
- * GitHub App credentials. Called once before spawning agents.
13
+ * Mint a GitHub App installation token; OPTIONALLY also write the bot
14
+ * identity + credential helper to the user's global git config.
15
15
  *
16
- * Sets up:
17
- * - A credential helper that returns a fresh installation token
18
- * - Bot identity (user.name, user.email) for commits
16
+ * The default is to leave `~/.gitconfig` alone — every agent run happens
17
+ * inside a Docker sandbox where `sandbox-entrypoint.sh` configures git at
18
+ * the container's `--system` scope using the `GIT_TOKEN` env var the
19
+ * harness forwards. The harness process itself does not need git
20
+ * credentials for normal operation.
19
21
  *
20
- * Works in Docker, local dev, CI no path assumptions.
21
- *
22
- * In local dev mode (LASTLIGHT_LOCAL_DEV=1) the global git config is NOT
23
- * modified — the host's identity and credential helper are left alone. The
24
- * token is still returned and propagates to sandboxes via env, where the
25
- * sandbox-entrypoint.sh sets up its own per-container credential helper.
22
+ * Set `LASTLIGHT_WRITE_GLOBAL_GIT=1` only if you have a non-sandboxed
23
+ * code path that needs the harness user to be able to push as the bot.
26
24
  */
27
25
  export declare function configureGitAuth(config: {
28
26
  appId: string;
@@ -41,12 +39,10 @@ export declare function configureGitAuth(config: {
41
39
  expiresAt: string;
42
40
  }>;
43
41
  /**
44
- * Refresh the git credential helper with a fresh token.
45
- * Call this if a push/pull fails with auth errors.
46
- *
47
- * In local dev mode the global git config is left alone — the fresh token is
48
- * returned to the caller (executor.ts) which forwards it to the sandbox via
49
- * env so the in-container credential helper picks it up.
42
+ * Mint a fresh installation token. Same opt-in rule as configureGitAuth:
43
+ * `LASTLIGHT_WRITE_GLOBAL_GIT=1` is required before this rotates the
44
+ * credential helper in the user's `~/.gitconfig`. Otherwise the token is
45
+ * just returned (executor.ts forwards it to the sandbox via env).
50
46
  */
51
47
  export declare function refreshGitAuth(config: {
52
48
  appId: string;
@@ -1,65 +1,122 @@
1
- import { execSync } from "child_process";
1
+ import { execFileSync } from "child_process";
2
2
  import { createSign } from "crypto";
3
- import { readFileSync } from "fs";
4
- import { resolve } from "path";
3
+ import { mkdirSync, readFileSync, writeFileSync } from "fs";
4
+ import { homedir } from "os";
5
+ import { dirname, join, resolve } from "path";
5
6
  /**
6
- * When true, all `git config --global` writes are skipped. The harness still
7
- * mints installation tokens and passes them to sandboxes via the GIT_TOKEN env
8
- * var, but the host's `~/.gitconfig` is left untouched. Set
9
- * `LASTLIGHT_LOCAL_DEV=1` when running the harness on your dev machine so it
10
- * doesn't overwrite your personal git identity or credential helper.
7
+ * Whether to write the bot identity + credential helper to the user's
8
+ * GLOBAL git config (`~/.gitconfig`). Defaults to **false** the harness
9
+ * still mints installation tokens and forwards them to sandboxes via the
10
+ * `GIT_TOKEN` env var, where `sandbox-entrypoint.sh` configures git at the
11
+ * container's `--system` scope. The host's `~/.gitconfig` is left
12
+ * untouched.
13
+ *
14
+ * Set `LASTLIGHT_WRITE_GLOBAL_GIT=1` only when the harness itself runs git
15
+ * commands against your real filesystem (e.g. a non-sandboxed direct
16
+ * execution path). Production Docker doesn't need this — the entrypoint
17
+ * sets `--system` config inside the container.
18
+ *
19
+ * `LASTLIGHT_LOCAL_DEV=1` is accepted as a compat alias for the inverse
20
+ * (legacy meaning: "skip global writes") and silently ignored; that is
21
+ * now the default. The flag is harmless if left in place but the
22
+ * intentional opt-in is `LASTLIGHT_WRITE_GLOBAL_GIT=1`.
11
23
  */
12
- function isLocalDev() {
13
- return process.env.LASTLIGHT_LOCAL_DEV === "1";
24
+ function shouldWriteGlobalGitConfig() {
25
+ return process.env.LASTLIGHT_WRITE_GLOBAL_GIT === "1";
14
26
  }
15
27
  /**
16
- * Configure git globally so that git clone/push/pull work with the
17
- * GitHub App credentials. Called once before spawning agents.
28
+ * Conservative shape check on a GitHub installation token. The credentials
29
+ * file we write contains a single URL of the form
30
+ * `https://x-access-token:${token}@github.com` — any `@`, `:`, `/`, or
31
+ * newline in the token would break URL parsing or inject extra entries.
32
+ * Real GitHub tokens are alphanumeric (plus `_`); this assertion catches
33
+ * any future format change before we write a malformed credentials file.
34
+ */
35
+ function assertSafeToken(token) {
36
+ if (!/^[A-Za-z0-9_-]+$/.test(token)) {
37
+ throw new Error("Refusing to embed a token containing characters outside [A-Za-z0-9_-] into git credentials file");
38
+ }
39
+ }
40
+ /**
41
+ * Resolve the path of the shared credentials file used by `credential.helper
42
+ * store`. Honors `LASTLIGHT_GIT_CREDENTIALS` so the sandbox entrypoint and
43
+ * the MCP server can agree on a path; falls back to `~/.config/lastlight/
44
+ * git-credentials` for the opt-in host write.
18
45
  *
19
- * Sets up:
20
- * - A credential helper that returns a fresh installation token
21
- * - Bot identity (user.name, user.email) for commits
46
+ * Whitespace in the path would break git's helper-arg splitting (the
47
+ * `store --file=<path>` value is shell-split on spaces, not exec'd), so
48
+ * reject any whitespace defensively.
49
+ */
50
+ function credentialsFilePath() {
51
+ const fromEnv = process.env.LASTLIGHT_GIT_CREDENTIALS?.trim();
52
+ const path = fromEnv || join(homedir(), ".config", "lastlight", "git-credentials");
53
+ if (/\s/.test(path)) {
54
+ throw new Error(`LASTLIGHT_GIT_CREDENTIALS contains whitespace; git's helper-arg parsing would break: ${path}`);
55
+ }
56
+ return path;
57
+ }
58
+ /**
59
+ * Write the credentials file consumed by `credential.helper store`. One
60
+ * line: `https://x-access-token:${token}@github.com`. File is mode 600,
61
+ * parent dir mode 700. Returns the absolute path.
62
+ */
63
+ function writeCredentialsFile(token) {
64
+ assertSafeToken(token);
65
+ const credPath = credentialsFilePath();
66
+ mkdirSync(dirname(credPath), { recursive: true, mode: 0o700 });
67
+ writeFileSync(credPath, `https://x-access-token:${token}@github.com\n`, { mode: 0o600 });
68
+ return credPath;
69
+ }
70
+ /**
71
+ * Mint a GitHub App installation token; OPTIONALLY also write the bot
72
+ * identity + credential helper to the user's global git config.
22
73
  *
23
- * Works in Docker, local dev, CIno path assumptions.
74
+ * The default is to leave `~/.gitconfig` alone every agent run happens
75
+ * inside a Docker sandbox where `sandbox-entrypoint.sh` configures git at
76
+ * the container's `--system` scope using the `GIT_TOKEN` env var the
77
+ * harness forwards. The harness process itself does not need git
78
+ * credentials for normal operation.
24
79
  *
25
- * In local dev mode (LASTLIGHT_LOCAL_DEV=1) the global git config is NOT
26
- * modified the host's identity and credential helper are left alone. The
27
- * token is still returned and propagates to sandboxes via env, where the
28
- * sandbox-entrypoint.sh sets up its own per-container credential helper.
80
+ * Set `LASTLIGHT_WRITE_GLOBAL_GIT=1` only if you have a non-sandboxed
81
+ * code path that needs the harness user to be able to push as the bot.
29
82
  */
30
83
  export async function configureGitAuth(config) {
31
84
  const token = await getInstallationToken(config);
32
- if (isLocalDev()) {
33
- console.log(`[git-auth] LOCAL DEV MODE skipping global git config writes. ` +
34
- `Token is still passed to sandboxes via GIT_TOKEN env (expires: ${token.expiresAt}).`);
85
+ if (!shouldWriteGlobalGitConfig()) {
86
+ console.log(`[git-auth] Minted GitHub App token (expires: ${token.expiresAt}). ` +
87
+ `Global git config left untouched; sandboxes receive the token via GIT_TOKEN. ` +
88
+ `Set LASTLIGHT_WRITE_GLOBAL_GIT=1 to also write ~/.gitconfig.`);
35
89
  return token;
36
90
  }
37
- // Set up credential helper git will call this for any github.com URL
38
- const credHelper = `!f() { echo "username=x-access-token"; echo "password=${token.token}"; }; f`;
39
- exec(`git config --global credential.helper '${credHelper}'`);
40
- // Bot identity
91
+ // Opt-in path: write the token to a 600-mode credentials file and point
92
+ // git's built-in `store` helper at it. No shell interpolation anywhere
93
+ // along the way — git invokes `credential-store --file=<path>` as
94
+ // argv-array, not through a shell.
95
+ const credPath = writeCredentialsFile(token.token);
96
+ execGit(["config", "--global", "credential.helper", `store --file=${credPath}`]);
41
97
  const botName = config.botName || "last-light";
42
- exec(`git config --global user.name "${botName}[bot]"`);
43
- exec(`git config --global user.email "${botName}[bot]@users.noreply.github.com"`);
44
- console.log(`[git-auth] Configured git with GitHub App token (expires: ${token.expiresAt})`);
98
+ execGit(["config", "--global", "user.name", `${botName}[bot]`]);
99
+ execGit(["config", "--global", "user.email", `${botName}[bot]@users.noreply.github.com`]);
100
+ console.log(`[git-auth] Configured GLOBAL git with GitHub App token (file: ${credPath}, expires: ${token.expiresAt})`);
45
101
  return token;
46
102
  }
47
103
  /**
48
- * Refresh the git credential helper with a fresh token.
49
- * Call this if a push/pull fails with auth errors.
50
- *
51
- * In local dev mode the global git config is left alone — the fresh token is
52
- * returned to the caller (executor.ts) which forwards it to the sandbox via
53
- * env so the in-container credential helper picks it up.
104
+ * Mint a fresh installation token. Same opt-in rule as configureGitAuth:
105
+ * `LASTLIGHT_WRITE_GLOBAL_GIT=1` is required before this rotates the
106
+ * credential helper in the user's `~/.gitconfig`. Otherwise the token is
107
+ * just returned (executor.ts forwards it to the sandbox via env).
54
108
  */
55
109
  export async function refreshGitAuth(config) {
56
110
  const token = await getInstallationToken(config);
57
- if (isLocalDev()) {
111
+ if (!shouldWriteGlobalGitConfig()) {
58
112
  return token;
59
113
  }
60
- const credHelper = `!f() { echo "username=x-access-token"; echo "password=${token.token}"; }; f`;
61
- exec(`git config --global credential.helper '${credHelper}'`);
62
- console.log(`[git-auth] Refreshed token (expires: ${token.expiresAt})`);
114
+ const credPath = writeCredentialsFile(token.token);
115
+ // The credential.helper config already points at this path from the
116
+ // initial configureGitAuth call, but set it again so refreshGitAuth is
117
+ // safe to call standalone (idempotent).
118
+ execGit(["config", "--global", "credential.helper", `store --file=${credPath}`]);
119
+ console.log(`[git-auth] Refreshed token in GLOBAL git config (file: ${credPath}, expires: ${token.expiresAt})`);
63
120
  return token;
64
121
  }
65
122
  // ── Internal ────────────────────────────────────────────────────────
@@ -98,7 +155,7 @@ async function getInstallationToken(config) {
98
155
  const data = await res.json();
99
156
  return { token: data.token, expiresAt: data.expires_at };
100
157
  }
101
- function exec(cmd) {
102
- execSync(cmd, { stdio: "pipe" });
158
+ function execGit(args) {
159
+ execFileSync("git", args, { stdio: "pipe" });
103
160
  }
104
161
  //# sourceMappingURL=git-auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-auth.js","sourceRoot":"","sources":["../../src/engine/git-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-auth.js","sourceRoot":"","sources":["../../src/engine/git-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAe9C;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,0BAA0B;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;IACrH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,mBAAmB;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;IAC9D,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wFAAwF,IAAI,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAa;IACzC,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,aAAa,CAAC,QAAQ,EAAE,0BAA0B,KAAK,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAYtC;IACC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,gDAAgD,KAAK,CAAC,SAAS,KAAK;YAC9E,+EAA+E;YAC/E,8DAA8D,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,uEAAuE;IACvE,kEAAkE;IAClE,mCAAmC;IACnC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,YAAY,CAAC;IAC/C,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,gCAAgC,CAAC,CAAC,CAAC;IAE1F,OAAO,CAAC,GAAG,CAAC,iEAAiE,QAAQ,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IAEvH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAWpC;IACC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,oEAAoE;IACpE,uEAAuE;IACvE,wCAAwC;IACxC,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEjF,OAAO,CAAC,GAAG,CAAC,0DAA0D,QAAQ,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IAChH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AAEvE,KAAK,UAAU,oBAAoB,CAAC,MAMnC;IACC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzE,+CAA+C;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxH,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;IAErD,kCAAkC;IAClC,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC/C,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAE3D,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,4CAA4C,MAAM,CAAC,cAAc,gBAAgB,EACjF;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,QAAQ,EAAE;YACnC,MAAM,EAAE,6BAA6B;YACrC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE;QACD,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CACF,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ vi.mock("child_process", () => ({
3
+ execSync: vi.fn(),
4
+ execFileSync: vi.fn(),
5
+ }));
6
+ vi.mock("fs", async (importOriginal) => {
7
+ const actual = await importOriginal();
8
+ return {
9
+ ...actual,
10
+ readFileSync: vi.fn().mockReturnValue("fake-pem"),
11
+ writeFileSync: vi.fn(),
12
+ mkdirSync: vi.fn(),
13
+ };
14
+ });
15
+ vi.mock("crypto", async (importOriginal) => {
16
+ const actual = await importOriginal();
17
+ return {
18
+ ...actual,
19
+ createSign: vi.fn().mockReturnValue({
20
+ update: vi.fn(),
21
+ sign: vi.fn().mockReturnValue("fakesig"),
22
+ }),
23
+ };
24
+ });
25
+ import { execSync, execFileSync } from "child_process";
26
+ import * as fs from "fs";
27
+ import { configureGitAuth, refreshGitAuth } from "./git-auth.js";
28
+ const mockExecSync = vi.mocked(execSync);
29
+ const mockExecFileSync = vi.mocked(execFileSync);
30
+ function mockFetchToken(token = "ghs_testtoken123") {
31
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
32
+ ok: true,
33
+ json: async () => ({ token, expires_at: "2099-01-01T00:00:00Z" }),
34
+ }));
35
+ }
36
+ const baseConfig = {
37
+ appId: "12345",
38
+ privateKeyPath: "/fake/key.pem",
39
+ installationId: "67890",
40
+ };
41
+ describe("git-auth — global ~/.gitconfig writes are opt-in", () => {
42
+ beforeEach(() => {
43
+ vi.clearAllMocks();
44
+ mockFetchToken();
45
+ // Default: NOT opted in — must not touch global git config.
46
+ delete process.env.LASTLIGHT_WRITE_GLOBAL_GIT;
47
+ });
48
+ it("configureGitAuth does NOT touch ~/.gitconfig by default", async () => {
49
+ await configureGitAuth(baseConfig);
50
+ expect(mockExecFileSync).not.toHaveBeenCalled();
51
+ });
52
+ it("refreshGitAuth does NOT touch ~/.gitconfig by default", async () => {
53
+ await refreshGitAuth(baseConfig);
54
+ expect(mockExecFileSync).not.toHaveBeenCalled();
55
+ });
56
+ it("configureGitAuth still returns the minted token when opted out", async () => {
57
+ const out = await configureGitAuth(baseConfig);
58
+ expect(out.token).toBe("ghs_testtoken123");
59
+ expect(out.expiresAt).toBe("2099-01-01T00:00:00Z");
60
+ });
61
+ });
62
+ describe("git-auth — opt-in global writes use execFileSync safely", () => {
63
+ beforeEach(() => {
64
+ vi.clearAllMocks();
65
+ mockFetchToken();
66
+ process.env.LASTLIGHT_WRITE_GLOBAL_GIT = "1";
67
+ });
68
+ it("configureGitAuth does not use execSync", async () => {
69
+ await configureGitAuth(baseConfig);
70
+ expect(mockExecSync).not.toHaveBeenCalled();
71
+ });
72
+ it("configureGitAuth calls execFileSync with git array args", async () => {
73
+ await configureGitAuth(baseConfig);
74
+ expect(mockExecFileSync).toHaveBeenCalled();
75
+ for (const call of mockExecFileSync.mock.calls) {
76
+ expect(call[0]).toBe("git");
77
+ expect(Array.isArray(call[1])).toBe(true);
78
+ }
79
+ });
80
+ it("configureGitAuth writes the token to a 600-mode credentials file (no shell interp)", async () => {
81
+ const token = "ghs_testtoken123";
82
+ mockFetchToken(token);
83
+ await configureGitAuth(baseConfig);
84
+ const writeMock = vi.mocked(fs.writeFileSync);
85
+ expect(writeMock).toHaveBeenCalled();
86
+ const [path, contents, opts] = writeMock.mock.calls[0];
87
+ expect(typeof path).toBe("string");
88
+ expect(contents).toBe(`https://x-access-token:${token}@github.com\n`);
89
+ expect(opts?.mode).toBe(0o600);
90
+ const credHelperCall = mockExecFileSync.mock.calls.find((c) => Array.isArray(c[1]) && c[1].includes("credential.helper"));
91
+ expect(credHelperCall).toBeDefined();
92
+ const args = credHelperCall[1];
93
+ const valueArg = args[args.length - 1];
94
+ // Helper value is the non-shell `store --file=<path>` form (no `!f`,
95
+ // no quotes, no interpolation).
96
+ expect(valueArg).toMatch(/^store --file=/);
97
+ expect(valueArg).not.toContain("!f()");
98
+ expect(valueArg).not.toContain(token);
99
+ });
100
+ it("configureGitAuth refuses tokens containing characters outside [A-Za-z0-9_-]", async () => {
101
+ mockFetchToken('ghs_evil";rm -rf /;"');
102
+ await expect(configureGitAuth(baseConfig)).rejects.toThrow(/outside \[A-Za-z0-9_-\]/);
103
+ });
104
+ it("refreshGitAuth does not use execSync", async () => {
105
+ await refreshGitAuth(baseConfig);
106
+ expect(mockExecSync).not.toHaveBeenCalled();
107
+ });
108
+ it("refreshGitAuth calls execFileSync with git array args", async () => {
109
+ await refreshGitAuth(baseConfig);
110
+ expect(mockExecFileSync).toHaveBeenCalled();
111
+ for (const call of mockExecFileSync.mock.calls) {
112
+ expect(call[0]).toBe("git");
113
+ expect(Array.isArray(call[1])).toBe(true);
114
+ }
115
+ });
116
+ });
117
+ //# sourceMappingURL=git-auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-auth.test.js","sourceRoot":"","sources":["../../src/engine/git-auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Octokit } from "octokit";
2
+ export interface GitHubAppClientConfig {
3
+ appId: string;
4
+ privateKeyPath: string;
5
+ installationId: string;
6
+ }
7
+ export declare function githubAppClient(config: GitHubAppClientConfig): Octokit;
@@ -0,0 +1,16 @@
1
+ import { createAppAuth } from "@octokit/auth-app";
2
+ import { readFileSync } from "fs";
3
+ import { Octokit } from "octokit";
4
+ import { resolve } from "path";
5
+ export function githubAppClient(config) {
6
+ const privateKey = readFileSync(resolve(config.privateKeyPath), "utf-8");
7
+ return new Octokit({
8
+ authStrategy: createAppAuth,
9
+ auth: {
10
+ appId: config.appId,
11
+ privateKey,
12
+ installationId: config.installationId,
13
+ },
14
+ });
15
+ }
16
+ //# sourceMappingURL=github-app-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-client.js","sourceRoot":"","sources":["../../src/engine/github-app-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAQ/B,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,IAAI,OAAO,CAAC;QACjB,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU;YACV,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};