lastlight 0.15.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +71 -692
  2. package/dist/cli-config.js.map +1 -0
  3. package/dist/cli-format.js.map +1 -0
  4. package/dist/{cli/cli-server.d.ts → cli-server.d.ts} +26 -1
  5. package/dist/{cli/cli-server.js → cli-server.js} +40 -5
  6. package/dist/cli-server.js.map +1 -0
  7. package/dist/cli-timeline.js.map +1 -0
  8. package/dist/{cli/cli.js → cli.js} +4 -3
  9. package/dist/cli.js.map +1 -0
  10. package/dist/{cli/fork-cli.d.ts → fork-cli.d.ts} +3 -3
  11. package/dist/{cli/fork-cli.js → fork-cli.js} +28 -27
  12. package/dist/fork-cli.js.map +1 -0
  13. package/dist/{cli/oauth-cli.js → oauth-cli.js} +1 -1
  14. package/dist/oauth-cli.js.map +1 -0
  15. package/dist/{cli/setup.js → setup.js} +10 -4
  16. package/dist/setup.js.map +1 -0
  17. package/dist/{cli/skills-install.d.ts → skills-install.d.ts} +6 -0
  18. package/dist/{cli/skills-install.js → skills-install.js} +6 -2
  19. package/dist/skills-install.js.map +1 -0
  20. package/package.json +20 -65
  21. package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
  22. package/agent-context/rules.md +0 -80
  23. package/agent-context/security.md +0 -69
  24. package/agent-context/soul.md +0 -21
  25. package/config/default.yaml +0 -119
  26. package/deploy/.env.production.example +0 -100
  27. package/deploy/entrypoint.sh +0 -82
  28. package/deploy/native/README.md +0 -160
  29. package/deploy/native/install.sh +0 -110
  30. package/deploy/native/lastlight.env.example +0 -95
  31. package/deploy/native/lastlight.service +0 -50
  32. package/deploy/sandbox-entrypoint.sh +0 -93
  33. package/dist/admin/auth.d.ts +0 -51
  34. package/dist/admin/auth.js +0 -121
  35. package/dist/admin/auth.js.map +0 -1
  36. package/dist/admin/chat-session-reader.d.ts +0 -39
  37. package/dist/admin/chat-session-reader.js +0 -84
  38. package/dist/admin/chat-session-reader.js.map +0 -1
  39. package/dist/admin/docker.d.ts +0 -61
  40. package/dist/admin/docker.js +0 -187
  41. package/dist/admin/docker.js.map +0 -1
  42. package/dist/admin/index.d.ts +0 -9
  43. package/dist/admin/index.js +0 -59
  44. package/dist/admin/index.js.map +0 -1
  45. package/dist/admin/routes.d.ts +0 -81
  46. package/dist/admin/routes.js +0 -1381
  47. package/dist/admin/routes.js.map +0 -1
  48. package/dist/admin/sessions.d.ts +0 -89
  49. package/dist/admin/sessions.js +0 -204
  50. package/dist/admin/sessions.js.map +0 -1
  51. package/dist/admin/tail.d.ts +0 -12
  52. package/dist/admin/tail.js +0 -145
  53. package/dist/admin/tail.js.map +0 -1
  54. package/dist/admin/version.d.ts +0 -22
  55. package/dist/admin/version.js +0 -92
  56. package/dist/admin/version.js.map +0 -1
  57. package/dist/cli/cli-config.js.map +0 -1
  58. package/dist/cli/cli-format.js.map +0 -1
  59. package/dist/cli/cli-server.js.map +0 -1
  60. package/dist/cli/cli-timeline.js.map +0 -1
  61. package/dist/cli/cli.js.map +0 -1
  62. package/dist/cli/fork-cli.js.map +0 -1
  63. package/dist/cli/oauth-cli.js.map +0 -1
  64. package/dist/cli/setup.js.map +0 -1
  65. package/dist/cli/skills-install.js.map +0 -1
  66. package/dist/config/config-resolve.d.ts +0 -28
  67. package/dist/config/config-resolve.js +0 -47
  68. package/dist/config/config-resolve.js.map +0 -1
  69. package/dist/config/config.d.ts +0 -157
  70. package/dist/config/config.js +0 -581
  71. package/dist/config/config.js.map +0 -1
  72. package/dist/config/core-pin.d.ts +0 -16
  73. package/dist/config/core-pin.js +0 -85
  74. package/dist/config/core-pin.js.map +0 -1
  75. package/dist/config/overlay-assets.d.ts +0 -20
  76. package/dist/config/overlay-assets.js +0 -114
  77. package/dist/config/overlay-assets.js.map +0 -1
  78. package/dist/config/overlay-bootstrap.d.ts +0 -44
  79. package/dist/config/overlay-bootstrap.js +0 -304
  80. package/dist/config/overlay-bootstrap.js.map +0 -1
  81. package/dist/connectors/github-webhook.d.ts +0 -45
  82. package/dist/connectors/github-webhook.js +0 -321
  83. package/dist/connectors/github-webhook.js.map +0 -1
  84. package/dist/connectors/index.d.ts +0 -18
  85. package/dist/connectors/index.js +0 -41
  86. package/dist/connectors/index.js.map +0 -1
  87. package/dist/connectors/messaging/base.d.ts +0 -42
  88. package/dist/connectors/messaging/base.js +0 -139
  89. package/dist/connectors/messaging/base.js.map +0 -1
  90. package/dist/connectors/messaging/delivery.d.ts +0 -14
  91. package/dist/connectors/messaging/delivery.js +0 -38
  92. package/dist/connectors/messaging/delivery.js.map +0 -1
  93. package/dist/connectors/messaging/index.d.ts +0 -4
  94. package/dist/connectors/messaging/index.js +0 -4
  95. package/dist/connectors/messaging/index.js.map +0 -1
  96. package/dist/connectors/messaging/session-manager.d.ts +0 -53
  97. package/dist/connectors/messaging/session-manager.js +0 -255
  98. package/dist/connectors/messaging/session-manager.js.map +0 -1
  99. package/dist/connectors/messaging/types.d.ts +0 -58
  100. package/dist/connectors/messaging/types.js +0 -7
  101. package/dist/connectors/messaging/types.js.map +0 -1
  102. package/dist/connectors/slack/connector.d.ts +0 -100
  103. package/dist/connectors/slack/connector.js +0 -341
  104. package/dist/connectors/slack/connector.js.map +0 -1
  105. package/dist/connectors/slack/index.d.ts +0 -2
  106. package/dist/connectors/slack/index.js +0 -3
  107. package/dist/connectors/slack/index.js.map +0 -1
  108. package/dist/connectors/slack/mrkdwn.d.ts +0 -8
  109. package/dist/connectors/slack/mrkdwn.js +0 -123
  110. package/dist/connectors/slack/mrkdwn.js.map +0 -1
  111. package/dist/connectors/types.d.ts +0 -61
  112. package/dist/connectors/types.js +0 -2
  113. package/dist/connectors/types.js.map +0 -1
  114. package/dist/cron/fanout.d.ts +0 -33
  115. package/dist/cron/fanout.js +0 -55
  116. package/dist/cron/fanout.js.map +0 -1
  117. package/dist/cron/jobs.d.ts +0 -18
  118. package/dist/cron/jobs.js +0 -37
  119. package/dist/cron/jobs.js.map +0 -1
  120. package/dist/cron/scheduler.d.ts +0 -45
  121. package/dist/cron/scheduler.js +0 -105
  122. package/dist/cron/scheduler.js.map +0 -1
  123. package/dist/engine/agent-executor.d.ts +0 -34
  124. package/dist/engine/agent-executor.js +0 -246
  125. package/dist/engine/agent-executor.js.map +0 -1
  126. package/dist/engine/chat/chat-runner.d.ts +0 -132
  127. package/dist/engine/chat/chat-runner.js +0 -424
  128. package/dist/engine/chat/chat-runner.js.map +0 -1
  129. package/dist/engine/chat/chat-skills.d.ts +0 -45
  130. package/dist/engine/chat/chat-skills.js +0 -184
  131. package/dist/engine/chat/chat-skills.js.map +0 -1
  132. package/dist/engine/chat/chat.d.ts +0 -54
  133. package/dist/engine/chat/chat.js +0 -316
  134. package/dist/engine/chat/chat.js.map +0 -1
  135. package/dist/engine/chat/message-batcher.d.ts +0 -32
  136. package/dist/engine/chat/message-batcher.js +0 -109
  137. package/dist/engine/chat/message-batcher.js.map +0 -1
  138. package/dist/engine/dispatcher.d.ts +0 -73
  139. package/dist/engine/dispatcher.js +0 -663
  140. package/dist/engine/dispatcher.js.map +0 -1
  141. package/dist/engine/event-shim.d.ts +0 -117
  142. package/dist/engine/event-shim.js +0 -435
  143. package/dist/engine/event-shim.js.map +0 -1
  144. package/dist/engine/executors/orchestrator.d.ts +0 -81
  145. package/dist/engine/executors/orchestrator.js +0 -365
  146. package/dist/engine/executors/orchestrator.js.map +0 -1
  147. package/dist/engine/executors/shared.d.ts +0 -189
  148. package/dist/engine/executors/shared.js +0 -616
  149. package/dist/engine/executors/shared.js.map +0 -1
  150. package/dist/engine/github/git-auth.d.ts +0 -62
  151. package/dist/engine/github/git-auth.js +0 -161
  152. package/dist/engine/github/git-auth.js.map +0 -1
  153. package/dist/engine/github/github-app-client.d.ts +0 -23
  154. package/dist/engine/github/github-app-client.js +0 -33
  155. package/dist/engine/github/github-app-client.js.map +0 -1
  156. package/dist/engine/github/github-tools.d.ts +0 -18
  157. package/dist/engine/github/github-tools.js +0 -263
  158. package/dist/engine/github/github-tools.js.map +0 -1
  159. package/dist/engine/github/github.d.ts +0 -1193
  160. package/dist/engine/github/github.js +0 -357
  161. package/dist/engine/github/github.js.map +0 -1
  162. package/dist/engine/github/profiles.d.ts +0 -279
  163. package/dist/engine/github/profiles.js +0 -42
  164. package/dist/engine/github/profiles.js.map +0 -1
  165. package/dist/engine/github/review-poster.d.ts +0 -98
  166. package/dist/engine/github/review-poster.js +0 -177
  167. package/dist/engine/github/review-poster.js.map +0 -1
  168. package/dist/engine/llm.d.ts +0 -79
  169. package/dist/engine/llm.js +0 -269
  170. package/dist/engine/llm.js.map +0 -1
  171. package/dist/engine/oauth.d.ts +0 -43
  172. package/dist/engine/oauth.js +0 -103
  173. package/dist/engine/oauth.js.map +0 -1
  174. package/dist/engine/router.d.ts +0 -29
  175. package/dist/engine/router.js +0 -680
  176. package/dist/engine/router.js.map +0 -1
  177. package/dist/engine/screen/classifier.d.ts +0 -93
  178. package/dist/engine/screen/classifier.js +0 -215
  179. package/dist/engine/screen/classifier.js.map +0 -1
  180. package/dist/engine/screen/screen.d.ts +0 -41
  181. package/dist/engine/screen/screen.js +0 -93
  182. package/dist/engine/screen/screen.js.map +0 -1
  183. package/dist/evals-api.d.ts +0 -24
  184. package/dist/evals-api.js +0 -22
  185. package/dist/evals-api.js.map +0 -1
  186. package/dist/index.d.ts +0 -1
  187. package/dist/index.js +0 -923
  188. package/dist/index.js.map +0 -1
  189. package/dist/managed-repos.d.ts +0 -30
  190. package/dist/managed-repos.js +0 -72
  191. package/dist/managed-repos.js.map +0 -1
  192. package/dist/notify/index.d.ts +0 -15
  193. package/dist/notify/index.js +0 -6
  194. package/dist/notify/index.js.map +0 -1
  195. package/dist/notify/model.d.ts +0 -57
  196. package/dist/notify/model.js +0 -89
  197. package/dist/notify/model.js.map +0 -1
  198. package/dist/notify/notifier.d.ts +0 -17
  199. package/dist/notify/notifier.js +0 -87
  200. package/dist/notify/notifier.js.map +0 -1
  201. package/dist/notify/render.d.ts +0 -21
  202. package/dist/notify/render.js +0 -59
  203. package/dist/notify/render.js.map +0 -1
  204. package/dist/notify/transports/github.d.ts +0 -26
  205. package/dist/notify/transports/github.js +0 -26
  206. package/dist/notify/transports/github.js.map +0 -1
  207. package/dist/notify/transports/slack.d.ts +0 -26
  208. package/dist/notify/transports/slack.js +0 -28
  209. package/dist/notify/transports/slack.js.map +0 -1
  210. package/dist/notify/types.d.ts +0 -95
  211. package/dist/notify/types.js +0 -16
  212. package/dist/notify/types.js.map +0 -1
  213. package/dist/providers.d.ts +0 -125
  214. package/dist/providers.js +0 -279
  215. package/dist/providers.js.map +0 -1
  216. package/dist/sandbox/docker.d.ts +0 -180
  217. package/dist/sandbox/docker.js +0 -517
  218. package/dist/sandbox/docker.js.map +0 -1
  219. package/dist/sandbox/egress-allowlist.d.ts +0 -74
  220. package/dist/sandbox/egress-allowlist.js +0 -164
  221. package/dist/sandbox/egress-allowlist.js.map +0 -1
  222. package/dist/sandbox/egress-firewall-config.d.ts +0 -127
  223. package/dist/sandbox/egress-firewall-config.js +0 -434
  224. package/dist/sandbox/egress-firewall-config.js.map +0 -1
  225. package/dist/sandbox/images.d.ts +0 -23
  226. package/dist/sandbox/images.js +0 -55
  227. package/dist/sandbox/images.js.map +0 -1
  228. package/dist/sandbox/index.d.ts +0 -112
  229. package/dist/sandbox/index.js +0 -332
  230. package/dist/sandbox/index.js.map +0 -1
  231. package/dist/sandbox/sandbox.d.ts +0 -214
  232. package/dist/sandbox/sandbox.js +0 -453
  233. package/dist/sandbox/sandbox.js.map +0 -1
  234. package/dist/sandbox/smol.d.ts +0 -162
  235. package/dist/sandbox/smol.js +0 -485
  236. package/dist/sandbox/smol.js.map +0 -1
  237. package/dist/session-log.d.ts +0 -63
  238. package/dist/session-log.js +0 -290
  239. package/dist/session-log.js.map +0 -1
  240. package/dist/state/approval-store.d.ts +0 -88
  241. package/dist/state/approval-store.js +0 -149
  242. package/dist/state/approval-store.js.map +0 -1
  243. package/dist/state/build-assets.d.ts +0 -50
  244. package/dist/state/build-assets.js +0 -154
  245. package/dist/state/build-assets.js.map +0 -1
  246. package/dist/state/db.d.ts +0 -81
  247. package/dist/state/db.js +0 -155
  248. package/dist/state/db.js.map +0 -1
  249. package/dist/state/execution-store.d.ts +0 -257
  250. package/dist/state/execution-store.js +0 -527
  251. package/dist/state/execution-store.js.map +0 -1
  252. package/dist/state/migrate.d.ts +0 -15
  253. package/dist/state/migrate.js +0 -175
  254. package/dist/state/migrate.js.map +0 -1
  255. package/dist/state/workflow-run-store.d.ts +0 -216
  256. package/dist/state/workflow-run-store.js +0 -403
  257. package/dist/state/workflow-run-store.js.map +0 -1
  258. package/dist/telemetry/index.d.ts +0 -38
  259. package/dist/telemetry/index.js +0 -253
  260. package/dist/telemetry/index.js.map +0 -1
  261. package/dist/telemetry/pi-events.d.ts +0 -12
  262. package/dist/telemetry/pi-events.js +0 -134
  263. package/dist/telemetry/pi-events.js.map +0 -1
  264. package/dist/workflows/dag.d.ts +0 -37
  265. package/dist/workflows/dag.js +0 -118
  266. package/dist/workflows/dag.js.map +0 -1
  267. package/dist/workflows/loader.d.ts +0 -53
  268. package/dist/workflows/loader.js +0 -421
  269. package/dist/workflows/loader.js.map +0 -1
  270. package/dist/workflows/loop-eval.d.ts +0 -28
  271. package/dist/workflows/loop-eval.js +0 -74
  272. package/dist/workflows/loop-eval.js.map +0 -1
  273. package/dist/workflows/phase-executor.d.ts +0 -215
  274. package/dist/workflows/phase-executor.js +0 -1144
  275. package/dist/workflows/phase-executor.js.map +0 -1
  276. package/dist/workflows/phase-ref.d.ts +0 -50
  277. package/dist/workflows/phase-ref.js +0 -91
  278. package/dist/workflows/phase-ref.js.map +0 -1
  279. package/dist/workflows/resume.d.ts +0 -58
  280. package/dist/workflows/resume.js +0 -313
  281. package/dist/workflows/resume.js.map +0 -1
  282. package/dist/workflows/runner.d.ts +0 -63
  283. package/dist/workflows/runner.js +0 -364
  284. package/dist/workflows/runner.js.map +0 -1
  285. package/dist/workflows/schema.d.ts +0 -344
  286. package/dist/workflows/schema.js +0 -460
  287. package/dist/workflows/schema.js.map +0 -1
  288. package/dist/workflows/simple.d.ts +0 -90
  289. package/dist/workflows/simple.js +0 -393
  290. package/dist/workflows/simple.js.map +0 -1
  291. package/dist/workflows/target-policy.d.ts +0 -74
  292. package/dist/workflows/target-policy.js +0 -80
  293. package/dist/workflows/target-policy.js.map +0 -1
  294. package/dist/workflows/templates.d.ts +0 -88
  295. package/dist/workflows/templates.js +0 -127
  296. package/dist/workflows/templates.js.map +0 -1
  297. package/dist/workflows/triggers.d.ts +0 -21
  298. package/dist/workflows/triggers.js +0 -45
  299. package/dist/workflows/triggers.js.map +0 -1
  300. package/dist/workflows/verdict.d.ts +0 -19
  301. package/dist/workflows/verdict.js +0 -30
  302. package/dist/workflows/verdict.js.map +0 -1
  303. package/dist/worktree/manager.d.ts +0 -43
  304. package/dist/worktree/manager.js +0 -127
  305. package/dist/worktree/manager.js.map +0 -1
  306. package/docker-compose.yml +0 -274
  307. package/sandbox.Dockerfile +0 -68
  308. package/skills/README.md +0 -42
  309. package/skills/browser-qa/SKILL.md +0 -208
  310. package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
  311. package/skills/building/SKILL.md +0 -95
  312. package/skills/chat/SKILL.md +0 -36
  313. package/skills/code-review/SKILL.md +0 -82
  314. package/skills/debug-production/SKILL.md +0 -108
  315. package/skills/demo/SKILL.md +0 -228
  316. package/skills/demo/scripts/compose-demo.sh +0 -243
  317. package/skills/issue-answer/SKILL.md +0 -91
  318. package/skills/issue-comment/SKILL.md +0 -49
  319. package/skills/issue-triage/SKILL.md +0 -149
  320. package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
  321. package/skills/pr-comment/SKILL.md +0 -64
  322. package/skills/pr-review/SKILL.md +0 -148
  323. package/skills/pr-review/references/findings-schema.md +0 -89
  324. package/skills/qa-test/SKILL.md +0 -97
  325. package/skills/repo-health/SKILL.md +0 -67
  326. package/skills/security-feedback/SKILL.md +0 -173
  327. package/skills/security-feedback/references/templates.md +0 -77
  328. package/skills/security-review/SKILL.md +0 -215
  329. package/skills/security-review/references/issue-format.md +0 -302
  330. package/skills/verify/SKILL.md +0 -118
  331. package/workflows/answer.yaml +0 -44
  332. package/workflows/build.yaml +0 -129
  333. package/workflows/cron-health.yaml +0 -6
  334. package/workflows/cron-review.yaml +0 -8
  335. package/workflows/cron-security.yaml +0 -6
  336. package/workflows/cron-triage.yaml +0 -8
  337. package/workflows/demo.yaml +0 -62
  338. package/workflows/examples/bash-smoke.yaml +0 -41
  339. package/workflows/examples/parallel-review.yaml +0 -36
  340. package/workflows/examples/tdd-loop.yaml +0 -17
  341. package/workflows/explore.yaml +0 -80
  342. package/workflows/issue-comment.yaml +0 -15
  343. package/workflows/issue-triage.yaml +0 -22
  344. package/workflows/pr-comment.yaml +0 -16
  345. package/workflows/pr-fix.yaml +0 -17
  346. package/workflows/pr-review.yaml +0 -50
  347. package/workflows/prompts/answer.md +0 -68
  348. package/workflows/prompts/architect.md +0 -44
  349. package/workflows/prompts/classifier.md +0 -60
  350. package/workflows/prompts/classify-adds-info.md +0 -17
  351. package/workflows/prompts/demo.md +0 -125
  352. package/workflows/prompts/executor.md +0 -42
  353. package/workflows/prompts/explore-ask.md +0 -99
  354. package/workflows/prompts/explore-publish.md +0 -31
  355. package/workflows/prompts/explore-read.md +0 -120
  356. package/workflows/prompts/explore-synthesize.md +0 -88
  357. package/workflows/prompts/fix.md +0 -18
  358. package/workflows/prompts/guardrails.md +0 -96
  359. package/workflows/prompts/pr-fix.md +0 -26
  360. package/workflows/prompts/pr.md +0 -39
  361. package/workflows/prompts/qa-browser.md +0 -95
  362. package/workflows/prompts/qa-synth.md +0 -44
  363. package/workflows/prompts/qa-test.md +0 -60
  364. package/workflows/prompts/re-reviewer.md +0 -33
  365. package/workflows/prompts/reviewer.md +0 -60
  366. package/workflows/prompts/verify-browser.md +0 -93
  367. package/workflows/prompts/verify-synth.md +0 -44
  368. package/workflows/prompts/verify.md +0 -63
  369. package/workflows/qa-test.yaml +0 -94
  370. package/workflows/repo-health.yaml +0 -15
  371. package/workflows/security-feedback.yaml +0 -25
  372. package/workflows/security-review.yaml +0 -37
  373. package/workflows/verify.yaml +0 -93
  374. /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
  375. /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
  376. /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
  377. /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
  378. /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
  379. /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
  380. /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
  381. /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
  382. /package/dist/{cli/setup.d.ts → setup.d.ts} +0 -0
@@ -1,62 +0,0 @@
1
- export type GitHubPermissionLevel = "read" | "write";
2
- /**
3
- * Subset of GitHub App installation-token permissions supported by Last Light.
4
- * Any omitted permission inherits the app's installation defaults.
5
- */
6
- export type GitHubTokenPermissions = Partial<{
7
- contents: GitHubPermissionLevel;
8
- issues: GitHubPermissionLevel;
9
- pull_requests: GitHubPermissionLevel;
10
- metadata: GitHubPermissionLevel;
11
- }>;
12
- /**
13
- * Mint a GitHub App installation token; OPTIONALLY also write the bot
14
- * identity + credential helper to the user's global git config.
15
- *
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.
21
- *
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.
24
- */
25
- export declare function configureGitAuth(config: {
26
- appId: string;
27
- privateKeyPath: string;
28
- installationId: string;
29
- /** Resolved bot login incl. the `[bot]` suffix (e.g. `last-light[bot]`). */
30
- botLogin?: string;
31
- /**
32
- * Optional repository-name allowlist for the minted installation token.
33
- * Names are repo names within the installation owner (e.g. ["lastlight"]).
34
- */
35
- repositories?: string[];
36
- /** Optional per-token permission downscoping. */
37
- permissions?: GitHubTokenPermissions;
38
- }): Promise<{
39
- token: string;
40
- expiresAt: string;
41
- }>;
42
- /**
43
- * Mint a fresh installation token. Same opt-in rule as configureGitAuth:
44
- * `LASTLIGHT_WRITE_GLOBAL_GIT=1` is required before this rotates the
45
- * credential helper in the user's `~/.gitconfig`. Otherwise the token is
46
- * just returned (executor.ts forwards it to the sandbox via env).
47
- */
48
- export declare function refreshGitAuth(config: {
49
- appId: string;
50
- privateKeyPath: string;
51
- installationId: string;
52
- /**
53
- * Optional repository-name allowlist for the minted installation token.
54
- * Names are repo names within the installation owner (e.g. ["lastlight"]).
55
- */
56
- repositories?: string[];
57
- /** Optional per-token permission downscoping. */
58
- permissions?: GitHubTokenPermissions;
59
- }): Promise<{
60
- token: string;
61
- expiresAt: string;
62
- }>;
@@ -1,161 +0,0 @@
1
- import { execFileSync } from "child_process";
2
- import { createSign } from "crypto";
3
- import { mkdirSync, readFileSync, writeFileSync } from "fs";
4
- import { homedir } from "os";
5
- import { dirname, join, resolve } from "path";
6
- /**
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`.
23
- */
24
- function shouldWriteGlobalGitConfig() {
25
- return process.env.LASTLIGHT_WRITE_GLOBAL_GIT === "1";
26
- }
27
- /**
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.
45
- *
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.
73
- *
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.
79
- *
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.
82
- */
83
- export async function configureGitAuth(config) {
84
- const token = await getInstallationToken(config);
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.`);
89
- return token;
90
- }
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}`]);
97
- const botLogin = config.botLogin || "last-light[bot]";
98
- execGit(["config", "--global", "user.name", botLogin]);
99
- execGit(["config", "--global", "user.email", `${botLogin}@users.noreply.github.com`]);
100
- console.log(`[git-auth] Configured GLOBAL git with GitHub App token (file: ${credPath}, expires: ${token.expiresAt})`);
101
- return token;
102
- }
103
- /**
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).
108
- */
109
- export async function refreshGitAuth(config) {
110
- const token = await getInstallationToken(config);
111
- if (!shouldWriteGlobalGitConfig()) {
112
- return token;
113
- }
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})`);
120
- return token;
121
- }
122
- // ── Internal ────────────────────────────────────────────────────────
123
- async function getInstallationToken(config) {
124
- const privateKey = readFileSync(resolve(config.privateKeyPath), "utf-8");
125
- // Generate JWT (RS256, no external dependency)
126
- const now = Math.floor(Date.now() / 1000);
127
- const header = Buffer.from(JSON.stringify({ alg: "RS256", typ: "JWT" })).toString("base64url");
128
- const payload = Buffer.from(JSON.stringify({ iat: now - 60, exp: now + 600, iss: config.appId })).toString("base64url");
129
- const signer = createSign("RSA-SHA256");
130
- signer.update(`${header}.${payload}`);
131
- const signature = signer.sign(privateKey, "base64url");
132
- const jwtToken = `${header}.${payload}.${signature}`;
133
- // Exchange for installation token
134
- const requestBody = {};
135
- if (config.repositories && config.repositories.length > 0) {
136
- requestBody.repositories = config.repositories;
137
- }
138
- if (config.permissions && Object.keys(config.permissions).length > 0) {
139
- requestBody.permissions = config.permissions;
140
- }
141
- const hasRequestBody = Object.keys(requestBody).length > 0;
142
- const res = await fetch(`https://api.github.com/app/installations/${config.installationId}/access_tokens`, {
143
- method: "POST",
144
- headers: {
145
- Authorization: `Bearer ${jwtToken}`,
146
- Accept: "application/vnd.github+json",
147
- ...(hasRequestBody ? { "Content-Type": "application/json" } : {}),
148
- },
149
- body: hasRequestBody ? JSON.stringify(requestBody) : undefined,
150
- });
151
- if (!res.ok) {
152
- const body = await res.text();
153
- throw new Error(`GitHub App token request failed (${res.status}): ${body}`);
154
- }
155
- const data = await res.json();
156
- return { token: data.token, expiresAt: data.expires_at };
157
- }
158
- function execGit(args) {
159
- execFileSync("git", args, { stdio: "pipe" });
160
- }
161
- //# sourceMappingURL=git-auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-auth.js","sourceRoot":"","sources":["../../../src/engine/github/git-auth.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import { Octokit } from "octokit";
2
- export interface GitHubAppClientConfig {
3
- appId: string;
4
- privateKeyPath: string;
5
- installationId: string;
6
- /**
7
- * Override the GitHub REST base URL (Octokit `baseUrl`). Prod leaves this
8
- * unset → `api.github.com`. The evals harness points it at its mock server so
9
- * harness-side writes land there. Test/eval escape hatch only — mirrors
10
- * `ExecutorConfig.githubApiBaseUrl`.
11
- */
12
- baseUrl?: string;
13
- }
14
- export declare function githubAppClient(config: GitHubAppClientConfig): Octokit;
15
- /**
16
- * Octokit authed with a raw bearer token (a pre-minted installation token) plus
17
- * an optional `baseUrl`. This is the auth shape the evals mock and the
18
- * harness-minted scoped token both use — no App JWT / installation-token
19
- * minting round-trip against the REST base URL. Used by the harness-side
20
- * `post-review` action so it works identically against api.github.com and the
21
- * eval mock.
22
- */
23
- export declare function githubTokenClient(token: string, baseUrl?: string): Octokit;
@@ -1,33 +0,0 @@
1
- import { createAppAuth } from "@octokit/auth-app";
2
- import { readFileSync } from "fs";
3
- import { Octokit } from "octokit";
4
- import { resolve } from "path";
5
- function normalizeBaseUrl(baseUrl) {
6
- return baseUrl ? baseUrl.replace(/\/+$/, "") : undefined;
7
- }
8
- export function githubAppClient(config) {
9
- const privateKey = readFileSync(resolve(config.privateKeyPath), "utf-8");
10
- const baseUrl = normalizeBaseUrl(config.baseUrl);
11
- return new Octokit({
12
- authStrategy: createAppAuth,
13
- auth: {
14
- appId: config.appId,
15
- privateKey,
16
- installationId: config.installationId,
17
- },
18
- ...(baseUrl ? { baseUrl } : {}),
19
- });
20
- }
21
- /**
22
- * Octokit authed with a raw bearer token (a pre-minted installation token) plus
23
- * an optional `baseUrl`. This is the auth shape the evals mock and the
24
- * harness-minted scoped token both use — no App JWT / installation-token
25
- * minting round-trip against the REST base URL. Used by the harness-side
26
- * `post-review` action so it works identically against api.github.com and the
27
- * eval mock.
28
- */
29
- export function githubTokenClient(token, baseUrl) {
30
- const url = normalizeBaseUrl(baseUrl);
31
- return new Octokit({ auth: token, ...(url ? { baseUrl: url } : {}) });
32
- }
33
- //# sourceMappingURL=github-app-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github-app-client.js","sourceRoot":"","sources":["../../../src/engine/github/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;AAe/B,SAAS,gBAAgB,CAAC,OAA2B;IACnD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,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;QACD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,OAAgB;IAC/D,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -1,18 +0,0 @@
1
- import type { Tool, ToolCall } from "@earendil-works/pi-ai";
2
- import { type GitHubAppClientConfig } from "./github-app-client.js";
3
- /**
4
- * Auth for the read-only chat GitHub tools. Either a GitHub App config or a
5
- * raw Personal Access Token (the PAT fallback). Both resolve to an Octokit.
6
- */
7
- export type ChatGitHubAuth = GitHubAppClientConfig | {
8
- token: string;
9
- baseUrl?: string;
10
- };
11
- export interface ChatGitHubToolset {
12
- tools: Tool[];
13
- execute(call: ToolCall): Promise<{
14
- content: string;
15
- isError: boolean;
16
- }>;
17
- }
18
- export declare function buildChatGitHubTools(auth: ChatGitHubAuth): ChatGitHubToolset;
@@ -1,263 +0,0 @@
1
- /**
2
- * Read-only GitHub tools registered with pi-ai for the in-process Slack
3
- * chat path. Severely scoped: the chat agent can look up issues / PRs /
4
- * comments / repo files / commits / search, and nothing else. There are
5
- * no write operations on this surface — issue creation, labels, branches,
6
- * commits, merges all live in the workflow path under sandbox isolation.
7
- *
8
- * Returned value is a `{ tools, execute }` pair. `tools` plugs into
9
- * pi-ai's `Context.tools`; `execute(toolCall)` is what the chat-runner
10
- * loop calls when the model emits a tool_call.
11
- */
12
- import { Type } from "@sinclair/typebox";
13
- import { githubAppClient, githubTokenClient } from "./github-app-client.js";
14
- function tool(name, description, parameters, handler) {
15
- return {
16
- name,
17
- description,
18
- parameters,
19
- handler: handler,
20
- };
21
- }
22
- export function buildChatGitHubTools(auth) {
23
- const octokit = "token" in auth
24
- ? githubTokenClient(auth.token, auth.baseUrl)
25
- : githubAppClient(auth);
26
- const entries = [
27
- tool("github_get_repository", "Get a repository's metadata (default branch, description, topics).", Type.Object({
28
- owner: Type.String(),
29
- repo: Type.String(),
30
- }), async ({ owner, repo }) => {
31
- const { data } = await octokit.rest.repos.get({ owner, repo });
32
- return {
33
- full_name: data.full_name,
34
- default_branch: data.default_branch,
35
- description: data.description,
36
- topics: data.topics ?? [],
37
- private: data.private,
38
- open_issues_count: data.open_issues_count,
39
- };
40
- }),
41
- tool("github_get_issue", "Get a single issue by number.", Type.Object({
42
- owner: Type.String(),
43
- repo: Type.String(),
44
- issue_number: Type.Number(),
45
- }), async ({ owner, repo, issue_number }) => {
46
- const { data } = await octokit.rest.issues.get({ owner, repo, issue_number });
47
- return {
48
- number: data.number,
49
- title: data.title,
50
- state: data.state,
51
- body: data.body,
52
- labels: (data.labels || []).map((l) => (typeof l === "string" ? l : l.name)),
53
- html_url: data.html_url,
54
- author: data.user?.login,
55
- created_at: data.created_at,
56
- updated_at: data.updated_at,
57
- };
58
- }),
59
- tool("github_list_issue_comments", "List comments on an issue or PR.", Type.Object({
60
- owner: Type.String(),
61
- repo: Type.String(),
62
- issue_number: Type.Number(),
63
- per_page: Type.Optional(Type.Number()),
64
- }), async ({ owner, repo, issue_number, per_page }) => {
65
- const { data } = await octokit.rest.issues.listComments({
66
- owner,
67
- repo,
68
- issue_number,
69
- per_page: per_page ?? 30,
70
- });
71
- return data.map((c) => ({
72
- id: c.id,
73
- author: c.user?.login,
74
- body: c.body,
75
- created_at: c.created_at,
76
- }));
77
- }),
78
- tool("github_list_issues", "List issues on a repository.", Type.Object({
79
- owner: Type.String(),
80
- repo: Type.String(),
81
- state: Type.Optional(Type.Union([Type.Literal("open"), Type.Literal("closed"), Type.Literal("all")])),
82
- labels: Type.Optional(Type.String({ description: "Comma-separated label names." })),
83
- per_page: Type.Optional(Type.Number()),
84
- }), async ({ owner, repo, state, labels, per_page }) => {
85
- const { data } = await octokit.rest.issues.listForRepo({
86
- owner,
87
- repo,
88
- state: state ?? "open",
89
- labels,
90
- per_page: per_page ?? 30,
91
- });
92
- return data
93
- .filter((i) => !i.pull_request)
94
- .map((i) => ({
95
- number: i.number,
96
- title: i.title,
97
- state: i.state,
98
- labels: (i.labels || []).map((l) => (typeof l === "string" ? l : l.name)),
99
- author: i.user?.login,
100
- updated_at: i.updated_at,
101
- }));
102
- }),
103
- tool("github_get_pull_request", "Get a single pull request by number.", Type.Object({
104
- owner: Type.String(),
105
- repo: Type.String(),
106
- pull_number: Type.Number(),
107
- }), async ({ owner, repo, pull_number }) => {
108
- const { data } = await octokit.rest.pulls.get({ owner, repo, pull_number });
109
- return {
110
- number: data.number,
111
- title: data.title,
112
- state: data.state,
113
- body: data.body,
114
- head: data.head.ref,
115
- base: data.base.ref,
116
- mergeable: data.mergeable,
117
- draft: data.draft,
118
- html_url: data.html_url,
119
- author: data.user?.login,
120
- };
121
- }),
122
- tool("github_get_pull_request_diff", "Get the unified diff of a pull request.", Type.Object({
123
- owner: Type.String(),
124
- repo: Type.String(),
125
- pull_number: Type.Number(),
126
- }), async ({ owner, repo, pull_number }) => {
127
- const { data } = await octokit.rest.pulls.get({
128
- owner,
129
- repo,
130
- pull_number,
131
- mediaType: { format: "diff" },
132
- });
133
- return { diff: data };
134
- }),
135
- tool("github_list_pull_requests", "List pull requests on a repository.", Type.Object({
136
- owner: Type.String(),
137
- repo: Type.String(),
138
- state: Type.Optional(Type.Union([Type.Literal("open"), Type.Literal("closed"), Type.Literal("all")])),
139
- per_page: Type.Optional(Type.Number()),
140
- }), async ({ owner, repo, state, per_page }) => {
141
- const { data } = await octokit.rest.pulls.list({
142
- owner,
143
- repo,
144
- state: state ?? "open",
145
- per_page: per_page ?? 30,
146
- });
147
- return data.map((p) => ({
148
- number: p.number,
149
- title: p.title,
150
- state: p.state,
151
- draft: p.draft,
152
- head: p.head.ref,
153
- base: p.base.ref,
154
- author: p.user?.login,
155
- updated_at: p.updated_at,
156
- }));
157
- }),
158
- tool("github_get_file_contents", "Read a file from a repository at the given ref (default: default branch).", Type.Object({
159
- owner: Type.String(),
160
- repo: Type.String(),
161
- path: Type.String(),
162
- ref: Type.Optional(Type.String()),
163
- }), async ({ owner, repo, path, ref }) => {
164
- const { data } = await octokit.rest.repos.getContent({ owner, repo, path, ref });
165
- if (Array.isArray(data)) {
166
- return data.map((d) => ({ name: d.name, type: d.type, size: d.size, path: d.path }));
167
- }
168
- if ("content" in data && data.content) {
169
- const text = Buffer.from(data.content, "base64").toString("utf-8");
170
- return { path: data.path, size: data.size, encoding: "utf-8", content: text };
171
- }
172
- return data;
173
- }),
174
- tool("github_list_commits", "List commits on a repository (optionally limited to a branch or path).", Type.Object({
175
- owner: Type.String(),
176
- repo: Type.String(),
177
- sha: Type.Optional(Type.String({ description: "Branch / commit SHA to start from." })),
178
- path: Type.Optional(Type.String()),
179
- per_page: Type.Optional(Type.Number()),
180
- }), async ({ owner, repo, sha, path, per_page }) => {
181
- const { data } = await octokit.rest.repos.listCommits({
182
- owner,
183
- repo,
184
- sha,
185
- path,
186
- per_page: per_page ?? 20,
187
- });
188
- return data.map((c) => ({
189
- sha: c.sha,
190
- message: c.commit.message,
191
- author: c.commit.author?.name,
192
- date: c.commit.author?.date,
193
- html_url: c.html_url,
194
- }));
195
- }),
196
- tool("github_search_issues", "Search across issues and pull requests with GitHub's search syntax.", Type.Object({
197
- q: Type.String({ description: "Search query, e.g. 'repo:owner/name is:open label:bug'." }),
198
- per_page: Type.Optional(Type.Number()),
199
- }), async ({ q, per_page }) => {
200
- const { data } = await octokit.rest.search.issuesAndPullRequests({
201
- q,
202
- per_page: per_page ?? 20,
203
- });
204
- return {
205
- total_count: data.total_count,
206
- items: data.items.map((i) => ({
207
- number: i.number,
208
- title: i.title,
209
- state: i.state,
210
- html_url: i.html_url,
211
- repository_url: i.repository_url,
212
- })),
213
- };
214
- }),
215
- tool("github_search_code", "Search code using GitHub's code search.", Type.Object({
216
- q: Type.String({ description: "Code search query, e.g. 'memorystore in:file repo:owner/name'." }),
217
- per_page: Type.Optional(Type.Number()),
218
- }), async ({ q, per_page }) => {
219
- const { data } = await octokit.rest.search.code({ q, per_page: per_page ?? 20 });
220
- return {
221
- total_count: data.total_count,
222
- items: data.items.map((i) => ({
223
- path: i.path,
224
- repository: i.repository.full_name,
225
- html_url: i.html_url,
226
- })),
227
- };
228
- }),
229
- ];
230
- const byName = new Map(entries.map((e) => [e.name, e]));
231
- const tools = entries.map((e) => ({
232
- name: e.name,
233
- description: e.description,
234
- parameters: e.parameters,
235
- }));
236
- return {
237
- tools,
238
- async execute(call) {
239
- const entry = byName.get(call.name);
240
- if (!entry) {
241
- return {
242
- content: JSON.stringify({ error: `unknown tool: ${call.name}` }),
243
- isError: true,
244
- };
245
- }
246
- try {
247
- const result = await entry.handler(call.arguments);
248
- return { content: JSON.stringify(result, null, 2), isError: false };
249
- }
250
- catch (err) {
251
- const e = err;
252
- return {
253
- content: JSON.stringify({
254
- error: e.message ?? String(err),
255
- status: e.status,
256
- }),
257
- isError: true,
258
- };
259
- }
260
- },
261
- };
262
- }
263
- //# sourceMappingURL=github-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github-tools.js","sourceRoot":"","sources":["../../../src/engine/github/github-tools.ts"],"names":[],"mappings":"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"}