@enbox/gitd 0.0.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 (502) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +134 -0
  3. package/dist/esm/ci.js +76 -0
  4. package/dist/esm/ci.js.map +1 -0
  5. package/dist/esm/cli/agent.js +86 -0
  6. package/dist/esm/cli/agent.js.map +1 -0
  7. package/dist/esm/cli/commands/ci.js +278 -0
  8. package/dist/esm/cli/commands/ci.js.map +1 -0
  9. package/dist/esm/cli/commands/clone.js +77 -0
  10. package/dist/esm/cli/commands/clone.js.map +1 -0
  11. package/dist/esm/cli/commands/daemon.js +132 -0
  12. package/dist/esm/cli/commands/daemon.js.map +1 -0
  13. package/dist/esm/cli/commands/github-api.js +36 -0
  14. package/dist/esm/cli/commands/github-api.js.map +1 -0
  15. package/dist/esm/cli/commands/init.js +69 -0
  16. package/dist/esm/cli/commands/init.js.map +1 -0
  17. package/dist/esm/cli/commands/issue.js +293 -0
  18. package/dist/esm/cli/commands/issue.js.map +1 -0
  19. package/dist/esm/cli/commands/log.js +90 -0
  20. package/dist/esm/cli/commands/log.js.map +1 -0
  21. package/dist/esm/cli/commands/migrate.js +444 -0
  22. package/dist/esm/cli/commands/migrate.js.map +1 -0
  23. package/dist/esm/cli/commands/notification.js +141 -0
  24. package/dist/esm/cli/commands/notification.js.map +1 -0
  25. package/dist/esm/cli/commands/org.js +353 -0
  26. package/dist/esm/cli/commands/org.js.map +1 -0
  27. package/dist/esm/cli/commands/patch.js +375 -0
  28. package/dist/esm/cli/commands/patch.js.map +1 -0
  29. package/dist/esm/cli/commands/registry.js +501 -0
  30. package/dist/esm/cli/commands/registry.js.map +1 -0
  31. package/dist/esm/cli/commands/release.js +197 -0
  32. package/dist/esm/cli/commands/release.js.map +1 -0
  33. package/dist/esm/cli/commands/repo.js +148 -0
  34. package/dist/esm/cli/commands/repo.js.map +1 -0
  35. package/dist/esm/cli/commands/serve.js +148 -0
  36. package/dist/esm/cli/commands/serve.js.map +1 -0
  37. package/dist/esm/cli/commands/setup.js +92 -0
  38. package/dist/esm/cli/commands/setup.js.map +1 -0
  39. package/dist/esm/cli/commands/shim.js +75 -0
  40. package/dist/esm/cli/commands/shim.js.map +1 -0
  41. package/dist/esm/cli/commands/social.js +206 -0
  42. package/dist/esm/cli/commands/social.js.map +1 -0
  43. package/dist/esm/cli/commands/web.js +36 -0
  44. package/dist/esm/cli/commands/web.js.map +1 -0
  45. package/dist/esm/cli/commands/wiki.js +185 -0
  46. package/dist/esm/cli/commands/wiki.js.map +1 -0
  47. package/dist/esm/cli/flags.js +29 -0
  48. package/dist/esm/cli/flags.js.map +1 -0
  49. package/dist/esm/cli/main.js +331 -0
  50. package/dist/esm/cli/main.js.map +1 -0
  51. package/dist/esm/cli/repo-context.js +53 -0
  52. package/dist/esm/cli/repo-context.js.map +1 -0
  53. package/dist/esm/daemon/adapter.js +18 -0
  54. package/dist/esm/daemon/adapter.js.map +1 -0
  55. package/dist/esm/daemon/adapters/github.js +112 -0
  56. package/dist/esm/daemon/adapters/github.js.map +1 -0
  57. package/dist/esm/daemon/adapters/go.js +51 -0
  58. package/dist/esm/daemon/adapters/go.js.map +1 -0
  59. package/dist/esm/daemon/adapters/index.js +32 -0
  60. package/dist/esm/daemon/adapters/index.js.map +1 -0
  61. package/dist/esm/daemon/adapters/npm.js +51 -0
  62. package/dist/esm/daemon/adapters/npm.js.map +1 -0
  63. package/dist/esm/daemon/adapters/oci.js +62 -0
  64. package/dist/esm/daemon/adapters/oci.js.map +1 -0
  65. package/dist/esm/daemon/index.js +12 -0
  66. package/dist/esm/daemon/index.js.map +1 -0
  67. package/dist/esm/daemon/server.js +167 -0
  68. package/dist/esm/daemon/server.js.map +1 -0
  69. package/dist/esm/git-remote/credential-helper.js +106 -0
  70. package/dist/esm/git-remote/credential-helper.js.map +1 -0
  71. package/dist/esm/git-remote/credential-main.js +109 -0
  72. package/dist/esm/git-remote/credential-main.js.map +1 -0
  73. package/dist/esm/git-remote/index.js +10 -0
  74. package/dist/esm/git-remote/index.js.map +1 -0
  75. package/dist/esm/git-remote/main.js +78 -0
  76. package/dist/esm/git-remote/main.js.map +1 -0
  77. package/dist/esm/git-remote/parse-url.js +60 -0
  78. package/dist/esm/git-remote/parse-url.js.map +1 -0
  79. package/dist/esm/git-remote/resolve.js +175 -0
  80. package/dist/esm/git-remote/resolve.js.map +1 -0
  81. package/dist/esm/git-remote/service.js +82 -0
  82. package/dist/esm/git-remote/service.js.map +1 -0
  83. package/dist/esm/git-server/auth.js +211 -0
  84. package/dist/esm/git-server/auth.js.map +1 -0
  85. package/dist/esm/git-server/bundle-restore.js +180 -0
  86. package/dist/esm/git-server/bundle-restore.js.map +1 -0
  87. package/dist/esm/git-server/bundle-sync.js +233 -0
  88. package/dist/esm/git-server/bundle-sync.js.map +1 -0
  89. package/dist/esm/git-server/did-service.js +73 -0
  90. package/dist/esm/git-server/did-service.js.map +1 -0
  91. package/dist/esm/git-server/git-backend.js +186 -0
  92. package/dist/esm/git-server/git-backend.js.map +1 -0
  93. package/dist/esm/git-server/http-handler.js +295 -0
  94. package/dist/esm/git-server/http-handler.js.map +1 -0
  95. package/dist/esm/git-server/index.js +16 -0
  96. package/dist/esm/git-server/index.js.map +1 -0
  97. package/dist/esm/git-server/push-authorizer.js +62 -0
  98. package/dist/esm/git-server/push-authorizer.js.map +1 -0
  99. package/dist/esm/git-server/ref-sync.js +132 -0
  100. package/dist/esm/git-server/ref-sync.js.map +1 -0
  101. package/dist/esm/git-server/server.js +185 -0
  102. package/dist/esm/git-server/server.js.map +1 -0
  103. package/dist/esm/git-server/verify.js +109 -0
  104. package/dist/esm/git-server/verify.js.map +1 -0
  105. package/dist/esm/github-shim/helpers.js +273 -0
  106. package/dist/esm/github-shim/helpers.js.map +1 -0
  107. package/dist/esm/github-shim/index.js +13 -0
  108. package/dist/esm/github-shim/index.js.map +1 -0
  109. package/dist/esm/github-shim/issues.js +318 -0
  110. package/dist/esm/github-shim/issues.js.map +1 -0
  111. package/dist/esm/github-shim/pulls.js +423 -0
  112. package/dist/esm/github-shim/pulls.js.map +1 -0
  113. package/dist/esm/github-shim/releases.js +154 -0
  114. package/dist/esm/github-shim/releases.js.map +1 -0
  115. package/dist/esm/github-shim/repos.js +86 -0
  116. package/dist/esm/github-shim/repos.js.map +1 -0
  117. package/dist/esm/github-shim/server.js +351 -0
  118. package/dist/esm/github-shim/server.js.map +1 -0
  119. package/dist/esm/github-shim/users.js +61 -0
  120. package/dist/esm/github-shim/users.js.map +1 -0
  121. package/dist/esm/index.js +26 -0
  122. package/dist/esm/index.js.map +1 -0
  123. package/dist/esm/indexer/api.js +132 -0
  124. package/dist/esm/indexer/api.js.map +1 -0
  125. package/dist/esm/indexer/crawler.js +256 -0
  126. package/dist/esm/indexer/crawler.js.map +1 -0
  127. package/dist/esm/indexer/index.js +9 -0
  128. package/dist/esm/indexer/index.js.map +1 -0
  129. package/dist/esm/indexer/main.js +76 -0
  130. package/dist/esm/indexer/main.js.map +1 -0
  131. package/dist/esm/indexer/store.js +334 -0
  132. package/dist/esm/indexer/store.js.map +1 -0
  133. package/dist/esm/issues.js +133 -0
  134. package/dist/esm/issues.js.map +1 -0
  135. package/dist/esm/notifications.js +47 -0
  136. package/dist/esm/notifications.js.map +1 -0
  137. package/dist/esm/org.js +90 -0
  138. package/dist/esm/org.js.map +1 -0
  139. package/dist/esm/patches.js +136 -0
  140. package/dist/esm/patches.js.map +1 -0
  141. package/dist/esm/refs.js +54 -0
  142. package/dist/esm/refs.js.map +1 -0
  143. package/dist/esm/registry.js +81 -0
  144. package/dist/esm/registry.js.map +1 -0
  145. package/dist/esm/releases.js +78 -0
  146. package/dist/esm/releases.js.map +1 -0
  147. package/dist/esm/repo.js +150 -0
  148. package/dist/esm/repo.js.map +1 -0
  149. package/dist/esm/resolver/index.js +10 -0
  150. package/dist/esm/resolver/index.js.map +1 -0
  151. package/dist/esm/resolver/resolve.js +189 -0
  152. package/dist/esm/resolver/resolve.js.map +1 -0
  153. package/dist/esm/resolver/trust-chain.js +155 -0
  154. package/dist/esm/resolver/trust-chain.js.map +1 -0
  155. package/dist/esm/resolver/verify.js +186 -0
  156. package/dist/esm/resolver/verify.js.map +1 -0
  157. package/dist/esm/shims/go/index.js +9 -0
  158. package/dist/esm/shims/go/index.js.map +1 -0
  159. package/dist/esm/shims/go/proxy.js +275 -0
  160. package/dist/esm/shims/go/proxy.js.map +1 -0
  161. package/dist/esm/shims/go/server.js +70 -0
  162. package/dist/esm/shims/go/server.js.map +1 -0
  163. package/dist/esm/shims/index.js +15 -0
  164. package/dist/esm/shims/index.js.map +1 -0
  165. package/dist/esm/shims/npm/index.js +9 -0
  166. package/dist/esm/shims/npm/index.js.map +1 -0
  167. package/dist/esm/shims/npm/registry.js +234 -0
  168. package/dist/esm/shims/npm/registry.js.map +1 -0
  169. package/dist/esm/shims/npm/server.js +72 -0
  170. package/dist/esm/shims/npm/server.js.map +1 -0
  171. package/dist/esm/shims/oci/index.js +9 -0
  172. package/dist/esm/shims/oci/index.js.map +1 -0
  173. package/dist/esm/shims/oci/registry.js +276 -0
  174. package/dist/esm/shims/oci/registry.js.map +1 -0
  175. package/dist/esm/shims/oci/server.js +82 -0
  176. package/dist/esm/shims/oci/server.js.map +1 -0
  177. package/dist/esm/social.js +70 -0
  178. package/dist/esm/social.js.map +1 -0
  179. package/dist/esm/web/html.js +123 -0
  180. package/dist/esm/web/html.js.map +1 -0
  181. package/dist/esm/web/index.js +7 -0
  182. package/dist/esm/web/index.js.map +1 -0
  183. package/dist/esm/web/routes.js +420 -0
  184. package/dist/esm/web/routes.js.map +1 -0
  185. package/dist/esm/web/server.js +225 -0
  186. package/dist/esm/web/server.js.map +1 -0
  187. package/dist/esm/wiki.js +63 -0
  188. package/dist/esm/wiki.js.map +1 -0
  189. package/dist/types/ci.d.ts +203 -0
  190. package/dist/types/ci.d.ts.map +1 -0
  191. package/dist/types/cli/agent.d.ts +59 -0
  192. package/dist/types/cli/agent.d.ts.map +1 -0
  193. package/dist/types/cli/commands/ci.d.ts +16 -0
  194. package/dist/types/cli/commands/ci.d.ts.map +1 -0
  195. package/dist/types/cli/commands/clone.d.ts +13 -0
  196. package/dist/types/cli/commands/clone.d.ts.map +1 -0
  197. package/dist/types/cli/commands/daemon.d.ts +29 -0
  198. package/dist/types/cli/commands/daemon.d.ts.map +1 -0
  199. package/dist/types/cli/commands/github-api.d.ts +14 -0
  200. package/dist/types/cli/commands/github-api.d.ts.map +1 -0
  201. package/dist/types/cli/commands/init.d.ts +11 -0
  202. package/dist/types/cli/commands/init.d.ts.map +1 -0
  203. package/dist/types/cli/commands/issue.d.ts +16 -0
  204. package/dist/types/cli/commands/issue.d.ts.map +1 -0
  205. package/dist/types/cli/commands/log.d.ts +13 -0
  206. package/dist/types/cli/commands/log.d.ts.map +1 -0
  207. package/dist/types/cli/commands/migrate.d.ts +19 -0
  208. package/dist/types/cli/commands/migrate.d.ts.map +1 -0
  209. package/dist/types/cli/commands/notification.d.ts +16 -0
  210. package/dist/types/cli/commands/notification.d.ts.map +1 -0
  211. package/dist/types/cli/commands/org.d.ts +19 -0
  212. package/dist/types/cli/commands/org.d.ts.map +1 -0
  213. package/dist/types/cli/commands/patch.d.ts +17 -0
  214. package/dist/types/cli/commands/patch.d.ts.map +1 -0
  215. package/dist/types/cli/commands/registry.d.ts +25 -0
  216. package/dist/types/cli/commands/registry.d.ts.map +1 -0
  217. package/dist/types/cli/commands/release.d.ts +13 -0
  218. package/dist/types/cli/commands/release.d.ts.map +1 -0
  219. package/dist/types/cli/commands/repo.d.ts +15 -0
  220. package/dist/types/cli/commands/repo.d.ts.map +1 -0
  221. package/dist/types/cli/commands/serve.d.ts +22 -0
  222. package/dist/types/cli/commands/serve.d.ts.map +1 -0
  223. package/dist/types/cli/commands/setup.d.ts +16 -0
  224. package/dist/types/cli/commands/setup.d.ts.map +1 -0
  225. package/dist/types/cli/commands/shim.d.ts +16 -0
  226. package/dist/types/cli/commands/shim.d.ts.map +1 -0
  227. package/dist/types/cli/commands/social.d.ts +19 -0
  228. package/dist/types/cli/commands/social.d.ts.map +1 -0
  229. package/dist/types/cli/commands/web.d.ts +14 -0
  230. package/dist/types/cli/commands/web.d.ts.map +1 -0
  231. package/dist/types/cli/commands/wiki.d.ts +14 -0
  232. package/dist/types/cli/commands/wiki.d.ts.map +1 -0
  233. package/dist/types/cli/flags.d.ts +16 -0
  234. package/dist/types/cli/flags.d.ts.map +1 -0
  235. package/dist/types/cli/main.d.ts +69 -0
  236. package/dist/types/cli/main.d.ts.map +1 -0
  237. package/dist/types/cli/repo-context.d.ts +30 -0
  238. package/dist/types/cli/repo-context.d.ts.map +1 -0
  239. package/dist/types/daemon/adapter.d.ts +74 -0
  240. package/dist/types/daemon/adapter.d.ts.map +1 -0
  241. package/dist/types/daemon/adapters/github.d.ts +10 -0
  242. package/dist/types/daemon/adapters/github.d.ts.map +1 -0
  243. package/dist/types/daemon/adapters/go.d.ts +10 -0
  244. package/dist/types/daemon/adapters/go.d.ts.map +1 -0
  245. package/dist/types/daemon/adapters/index.d.ts +22 -0
  246. package/dist/types/daemon/adapters/index.d.ts.map +1 -0
  247. package/dist/types/daemon/adapters/npm.d.ts +10 -0
  248. package/dist/types/daemon/adapters/npm.d.ts.map +1 -0
  249. package/dist/types/daemon/adapters/oci.d.ts +10 -0
  250. package/dist/types/daemon/adapters/oci.d.ts.map +1 -0
  251. package/dist/types/daemon/index.d.ts +14 -0
  252. package/dist/types/daemon/index.d.ts.map +1 -0
  253. package/dist/types/daemon/server.d.ts +55 -0
  254. package/dist/types/daemon/server.d.ts.map +1 -0
  255. package/dist/types/git-remote/credential-helper.d.ts +49 -0
  256. package/dist/types/git-remote/credential-helper.d.ts.map +1 -0
  257. package/dist/types/git-remote/credential-main.d.ts +24 -0
  258. package/dist/types/git-remote/credential-main.d.ts.map +1 -0
  259. package/dist/types/git-remote/index.d.ts +10 -0
  260. package/dist/types/git-remote/index.d.ts.map +1 -0
  261. package/dist/types/git-remote/main.d.ts +23 -0
  262. package/dist/types/git-remote/main.d.ts.map +1 -0
  263. package/dist/types/git-remote/parse-url.d.ts +32 -0
  264. package/dist/types/git-remote/parse-url.d.ts.map +1 -0
  265. package/dist/types/git-remote/resolve.d.ts +30 -0
  266. package/dist/types/git-remote/resolve.d.ts.map +1 -0
  267. package/dist/types/git-remote/service.d.ts +75 -0
  268. package/dist/types/git-remote/service.d.ts.map +1 -0
  269. package/dist/types/git-server/auth.d.ts +129 -0
  270. package/dist/types/git-server/auth.d.ts.map +1 -0
  271. package/dist/types/git-server/bundle-restore.d.ts +48 -0
  272. package/dist/types/git-server/bundle-restore.d.ts.map +1 -0
  273. package/dist/types/git-server/bundle-sync.d.ts +90 -0
  274. package/dist/types/git-server/bundle-sync.d.ts.map +1 -0
  275. package/dist/types/git-server/did-service.d.ts +26 -0
  276. package/dist/types/git-server/did-service.d.ts.map +1 -0
  277. package/dist/types/git-server/git-backend.d.ts +84 -0
  278. package/dist/types/git-server/git-backend.d.ts.map +1 -0
  279. package/dist/types/git-server/http-handler.d.ts +73 -0
  280. package/dist/types/git-server/http-handler.d.ts.map +1 -0
  281. package/dist/types/git-server/index.d.ts +16 -0
  282. package/dist/types/git-server/index.d.ts.map +1 -0
  283. package/dist/types/git-server/push-authorizer.d.ts +38 -0
  284. package/dist/types/git-server/push-authorizer.d.ts.map +1 -0
  285. package/dist/types/git-server/ref-sync.d.ts +52 -0
  286. package/dist/types/git-server/ref-sync.d.ts.map +1 -0
  287. package/dist/types/git-server/server.d.ts +70 -0
  288. package/dist/types/git-server/server.d.ts.map +1 -0
  289. package/dist/types/git-server/verify.d.ts +12 -0
  290. package/dist/types/git-server/verify.d.ts.map +1 -0
  291. package/dist/types/github-shim/helpers.d.ts +108 -0
  292. package/dist/types/github-shim/helpers.d.ts.map +1 -0
  293. package/dist/types/github-shim/index.d.ts +15 -0
  294. package/dist/types/github-shim/index.d.ts.map +1 -0
  295. package/dist/types/github-shim/issues.d.ts +24 -0
  296. package/dist/types/github-shim/issues.d.ts.map +1 -0
  297. package/dist/types/github-shim/pulls.d.ts +31 -0
  298. package/dist/types/github-shim/pulls.d.ts.map +1 -0
  299. package/dist/types/github-shim/releases.d.ts +18 -0
  300. package/dist/types/github-shim/releases.d.ts.map +1 -0
  301. package/dist/types/github-shim/repos.d.ts +21 -0
  302. package/dist/types/github-shim/repos.d.ts.map +1 -0
  303. package/dist/types/github-shim/server.d.ts +53 -0
  304. package/dist/types/github-shim/server.d.ts.map +1 -0
  305. package/dist/types/github-shim/users.d.ts +17 -0
  306. package/dist/types/github-shim/users.d.ts.map +1 -0
  307. package/dist/types/index.d.ts +26 -0
  308. package/dist/types/index.d.ts.map +1 -0
  309. package/dist/types/indexer/api.d.ts +32 -0
  310. package/dist/types/indexer/api.d.ts.map +1 -0
  311. package/dist/types/indexer/crawler.d.ts +72 -0
  312. package/dist/types/indexer/crawler.d.ts.map +1 -0
  313. package/dist/types/indexer/index.d.ts +12 -0
  314. package/dist/types/indexer/index.d.ts.map +1 -0
  315. package/dist/types/indexer/main.d.ts +21 -0
  316. package/dist/types/indexer/main.d.ts.map +1 -0
  317. package/dist/types/indexer/store.d.ts +168 -0
  318. package/dist/types/indexer/store.d.ts.map +1 -0
  319. package/dist/types/issues.d.ts +395 -0
  320. package/dist/types/issues.d.ts.map +1 -0
  321. package/dist/types/notifications.d.ts +93 -0
  322. package/dist/types/notifications.d.ts.map +1 -0
  323. package/dist/types/org.d.ts +232 -0
  324. package/dist/types/org.d.ts.map +1 -0
  325. package/dist/types/patches.d.ts +410 -0
  326. package/dist/types/patches.d.ts.map +1 -0
  327. package/dist/types/refs.d.ts +114 -0
  328. package/dist/types/refs.d.ts.map +1 -0
  329. package/dist/types/registry.d.ts +212 -0
  330. package/dist/types/registry.d.ts.map +1 -0
  331. package/dist/types/releases.d.ts +204 -0
  332. package/dist/types/releases.d.ts.map +1 -0
  333. package/dist/types/repo.d.ts +450 -0
  334. package/dist/types/repo.d.ts.map +1 -0
  335. package/dist/types/resolver/index.d.ts +13 -0
  336. package/dist/types/resolver/index.d.ts.map +1 -0
  337. package/dist/types/resolver/resolve.d.ts +80 -0
  338. package/dist/types/resolver/resolve.d.ts.map +1 -0
  339. package/dist/types/resolver/trust-chain.d.ts +54 -0
  340. package/dist/types/resolver/trust-chain.d.ts.map +1 -0
  341. package/dist/types/resolver/verify.d.ts +62 -0
  342. package/dist/types/resolver/verify.d.ts.map +1 -0
  343. package/dist/types/shims/go/index.d.ts +11 -0
  344. package/dist/types/shims/go/index.d.ts.map +1 -0
  345. package/dist/types/shims/go/proxy.d.ts +51 -0
  346. package/dist/types/shims/go/proxy.d.ts.map +1 -0
  347. package/dist/types/shims/go/server.d.ts +23 -0
  348. package/dist/types/shims/go/server.d.ts.map +1 -0
  349. package/dist/types/shims/index.d.ts +18 -0
  350. package/dist/types/shims/index.d.ts.map +1 -0
  351. package/dist/types/shims/npm/index.d.ts +11 -0
  352. package/dist/types/shims/npm/index.d.ts.map +1 -0
  353. package/dist/types/shims/npm/registry.d.ts +46 -0
  354. package/dist/types/shims/npm/registry.d.ts.map +1 -0
  355. package/dist/types/shims/npm/server.d.ts +23 -0
  356. package/dist/types/shims/npm/server.d.ts.map +1 -0
  357. package/dist/types/shims/oci/index.d.ts +11 -0
  358. package/dist/types/shims/oci/index.d.ts.map +1 -0
  359. package/dist/types/shims/oci/registry.d.ts +56 -0
  360. package/dist/types/shims/oci/registry.d.ts.map +1 -0
  361. package/dist/types/shims/oci/server.d.ts +23 -0
  362. package/dist/types/shims/oci/server.d.ts.map +1 -0
  363. package/dist/types/social.d.ts +162 -0
  364. package/dist/types/social.d.ts.map +1 -0
  365. package/dist/types/web/html.d.ts +23 -0
  366. package/dist/types/web/html.d.ts.map +1 -0
  367. package/dist/types/web/index.d.ts +8 -0
  368. package/dist/types/web/index.d.ts.map +1 -0
  369. package/dist/types/web/routes.d.ts +21 -0
  370. package/dist/types/web/routes.d.ts.map +1 -0
  371. package/dist/types/web/server.d.ts +38 -0
  372. package/dist/types/web/server.d.ts.map +1 -0
  373. package/dist/types/wiki.d.ts +143 -0
  374. package/dist/types/wiki.d.ts.map +1 -0
  375. package/package.json +108 -0
  376. package/schemas/ci/check-run.json +23 -0
  377. package/schemas/ci/check-suite.json +23 -0
  378. package/schemas/issues/assignment.json +17 -0
  379. package/schemas/issues/comment.json +14 -0
  380. package/schemas/issues/issue.json +20 -0
  381. package/schemas/issues/label.json +17 -0
  382. package/schemas/issues/reaction.json +14 -0
  383. package/schemas/issues/status-change.json +14 -0
  384. package/schemas/notifications/notification.json +20 -0
  385. package/schemas/org/org-member.json +17 -0
  386. package/schemas/org/org.json +26 -0
  387. package/schemas/org/team-member.json +17 -0
  388. package/schemas/org/team.json +17 -0
  389. package/schemas/patches/merge-result.json +14 -0
  390. package/schemas/patches/patch-status-change.json +14 -0
  391. package/schemas/patches/patch.json +20 -0
  392. package/schemas/patches/review-comment.json +17 -0
  393. package/schemas/patches/review.json +14 -0
  394. package/schemas/patches/revision.json +30 -0
  395. package/schemas/refs/git-ref.json +32 -0
  396. package/schemas/registry/attestation.json +23 -0
  397. package/schemas/registry/package-version.json +23 -0
  398. package/schemas/registry/package.json +32 -0
  399. package/schemas/releases/release.json +17 -0
  400. package/schemas/repo/collaborator.json +17 -0
  401. package/schemas/repo/repo.json +35 -0
  402. package/schemas/repo/settings.json +39 -0
  403. package/schemas/repo/topic.json +14 -0
  404. package/schemas/repo/webhook.json +26 -0
  405. package/schemas/social/activity.json +23 -0
  406. package/schemas/social/follow.json +17 -0
  407. package/schemas/social/star.json +20 -0
  408. package/schemas/wiki/wiki-history.json +20 -0
  409. package/schemas/wiki/wiki-page.json +17 -0
  410. package/src/ci.ts +118 -0
  411. package/src/cli/agent.ts +117 -0
  412. package/src/cli/commands/ci.ts +300 -0
  413. package/src/cli/commands/clone.ts +78 -0
  414. package/src/cli/commands/daemon.ts +129 -0
  415. package/src/cli/commands/github-api.ts +30 -0
  416. package/src/cli/commands/init.ts +69 -0
  417. package/src/cli/commands/issue.ts +321 -0
  418. package/src/cli/commands/log.ts +106 -0
  419. package/src/cli/commands/migrate.ts +525 -0
  420. package/src/cli/commands/notification.ts +148 -0
  421. package/src/cli/commands/org.ts +381 -0
  422. package/src/cli/commands/patch.ts +413 -0
  423. package/src/cli/commands/registry.ts +542 -0
  424. package/src/cli/commands/release.ts +189 -0
  425. package/src/cli/commands/repo.ts +160 -0
  426. package/src/cli/commands/serve.ts +153 -0
  427. package/src/cli/commands/setup.ts +97 -0
  428. package/src/cli/commands/shim.ts +79 -0
  429. package/src/cli/commands/social.ts +221 -0
  430. package/src/cli/commands/web.ts +30 -0
  431. package/src/cli/commands/wiki.ts +199 -0
  432. package/src/cli/flags.ts +28 -0
  433. package/src/cli/main.ts +350 -0
  434. package/src/cli/repo-context.ts +55 -0
  435. package/src/daemon/adapter.ts +95 -0
  436. package/src/daemon/adapters/github.ts +86 -0
  437. package/src/daemon/adapters/go.ts +47 -0
  438. package/src/daemon/adapters/index.ts +36 -0
  439. package/src/daemon/adapters/npm.ts +47 -0
  440. package/src/daemon/adapters/oci.ts +59 -0
  441. package/src/daemon/index.ts +16 -0
  442. package/src/daemon/server.ts +204 -0
  443. package/src/git-remote/credential-helper.ts +114 -0
  444. package/src/git-remote/credential-main.ts +118 -0
  445. package/src/git-remote/index.ts +10 -0
  446. package/src/git-remote/main.ts +74 -0
  447. package/src/git-remote/parse-url.ts +81 -0
  448. package/src/git-remote/resolve.ts +207 -0
  449. package/src/git-remote/service.ts +126 -0
  450. package/src/git-server/auth.ts +308 -0
  451. package/src/git-server/bundle-restore.ts +217 -0
  452. package/src/git-server/bundle-sync.ts +300 -0
  453. package/src/git-server/did-service.ts +77 -0
  454. package/src/git-server/git-backend.ts +222 -0
  455. package/src/git-server/http-handler.ts +386 -0
  456. package/src/git-server/index.ts +16 -0
  457. package/src/git-server/push-authorizer.ts +77 -0
  458. package/src/git-server/ref-sync.ts +166 -0
  459. package/src/git-server/server.ts +236 -0
  460. package/src/git-server/verify.ts +116 -0
  461. package/src/github-shim/helpers.ts +311 -0
  462. package/src/github-shim/index.ts +35 -0
  463. package/src/github-shim/issues.ts +389 -0
  464. package/src/github-shim/pulls.ts +500 -0
  465. package/src/github-shim/releases.ts +185 -0
  466. package/src/github-shim/repos.ts +95 -0
  467. package/src/github-shim/server.ts +334 -0
  468. package/src/github-shim/users.ts +63 -0
  469. package/src/index.ts +26 -0
  470. package/src/indexer/api.ts +162 -0
  471. package/src/indexer/crawler.ts +290 -0
  472. package/src/indexer/index.ts +22 -0
  473. package/src/indexer/main.ts +83 -0
  474. package/src/indexer/store.ts +408 -0
  475. package/src/issues.ts +200 -0
  476. package/src/notifications.ts +80 -0
  477. package/src/org.ts +147 -0
  478. package/src/patches.ts +203 -0
  479. package/src/refs.ts +94 -0
  480. package/src/registry.ts +132 -0
  481. package/src/releases.ts +124 -0
  482. package/src/repo.ts +234 -0
  483. package/src/resolver/index.ts +42 -0
  484. package/src/resolver/resolve.ts +244 -0
  485. package/src/resolver/trust-chain.ts +217 -0
  486. package/src/resolver/verify.ts +237 -0
  487. package/src/shims/go/index.ts +14 -0
  488. package/src/shims/go/proxy.ts +336 -0
  489. package/src/shims/go/server.ts +82 -0
  490. package/src/shims/index.ts +20 -0
  491. package/src/shims/npm/index.ts +14 -0
  492. package/src/shims/npm/registry.ts +288 -0
  493. package/src/shims/npm/server.ts +84 -0
  494. package/src/shims/oci/index.ts +14 -0
  495. package/src/shims/oci/registry.ts +334 -0
  496. package/src/shims/oci/server.ts +94 -0
  497. package/src/social.ts +116 -0
  498. package/src/web/html.ts +120 -0
  499. package/src/web/index.ts +8 -0
  500. package/src/web/routes.ts +449 -0
  501. package/src/web/server.ts +256 -0
  502. package/src/wiki.ts +102 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Git transport sidecar server.
3
+ *
4
+ * A standalone HTTP server that serves Git smart HTTP transport alongside
5
+ * a DWN. Uses Node.js `http` module for maximum compatibility.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * import { createGitServer } from '@enbox/gitd/git-server/server';
10
+ *
11
+ * const server = createGitServer({
12
+ * basePath : '/var/lib/gitd/repos',
13
+ * port : 9418,
14
+ * });
15
+ *
16
+ * console.log(`Git server listening on port ${server.port}`);
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+
22
+ import type { IncomingMessage } from 'node:http';
23
+
24
+ import { createServer } from 'node:http';
25
+
26
+ import { createGitHttpHandler } from './http-handler.js';
27
+ import { GitBackend } from './git-backend.js';
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // Types
31
+ // ---------------------------------------------------------------------------
32
+
33
+ /** Default maximum request body size for git pack data (50 MB). */
34
+ const DEFAULT_MAX_BODY_GIT = 50 * 1024 * 1024;
35
+
36
+ /** Configuration for the git transport sidecar server. */
37
+ export type GitServerOptions = {
38
+ /** Base directory for storing bare repositories. */
39
+ basePath: string;
40
+
41
+ /** TCP port to listen on. Use 0 for a random available port. @default 9418 */
42
+ port?: number;
43
+
44
+ /** Hostname to bind to. @default '0.0.0.0' */
45
+ hostname?: string;
46
+
47
+ /** Optional path prefix for the HTTP handler (e.g. `/git`). */
48
+ pathPrefix?: string;
49
+
50
+ /**
51
+ * Optional authentication callback for push operations.
52
+ * @see GitHttpHandlerOptions.authenticatePush
53
+ */
54
+ authenticatePush?: (request: Request, did: string, repo: string) => Promise<boolean>;
55
+
56
+ /**
57
+ * Optional callback invoked after a successful push.
58
+ * @see GitHttpHandlerOptions.onPushComplete
59
+ */
60
+ onPushComplete?: (did: string, repo: string, repoPath: string) => Promise<void>;
61
+
62
+ /**
63
+ * Optional callback invoked when a repo is not found on disk.
64
+ * Implementations can restore the repo from DWN bundle records.
65
+ * @see GitHttpHandlerOptions.onRepoNotFound
66
+ */
67
+ onRepoNotFound?: (did: string, repo: string, repoPath: string) => Promise<boolean>;
68
+
69
+ /**
70
+ * Maximum request body size in bytes for POST requests (git pack data).
71
+ * @default 50 * 1024 * 1024 (50 MB)
72
+ */
73
+ maxBodySize?: number;
74
+ };
75
+
76
+ /** A running git server instance. */
77
+ export type GitServer = {
78
+ /** The TCP port the server is listening on. */
79
+ port: number;
80
+
81
+ /** The git backend managing repositories. */
82
+ backend: GitBackend;
83
+
84
+ /** Stop the server. Returns a promise that resolves when fully closed. */
85
+ stop(): Promise<void>;
86
+ };
87
+
88
+ // ---------------------------------------------------------------------------
89
+ // Server factory
90
+ // ---------------------------------------------------------------------------
91
+
92
+ /**
93
+ * Create and start a git transport sidecar server.
94
+ *
95
+ * @param options - Server configuration
96
+ * @returns A promise resolving to a running GitServer instance
97
+ */
98
+ export async function createGitServer(options: GitServerOptions): Promise<GitServer> {
99
+ const {
100
+ basePath,
101
+ port = 9418,
102
+ hostname = '0.0.0.0',
103
+ pathPrefix,
104
+ authenticatePush,
105
+ onPushComplete,
106
+ onRepoNotFound,
107
+ maxBodySize = DEFAULT_MAX_BODY_GIT,
108
+ } = options;
109
+
110
+ const backend = new GitBackend({ basePath });
111
+
112
+ const fetchHandler = createGitHttpHandler({
113
+ backend,
114
+ pathPrefix,
115
+ authenticatePush,
116
+ onPushComplete,
117
+ onRepoNotFound,
118
+ });
119
+
120
+ const server = createServer(async (req, res) => {
121
+ // Health check endpoint.
122
+ if (req.url === '/health') {
123
+ res.writeHead(200, { 'Content-Type': 'application/json' });
124
+ res.end(JSON.stringify({ status: 'ok', service: 'git-server' }));
125
+ return;
126
+ }
127
+
128
+ try {
129
+ // Build a Request object from the Node.js IncomingMessage.
130
+ const url = `http://${req.headers.host ?? 'localhost'}${req.url ?? '/'}`;
131
+ const headers = new Headers();
132
+ for (const [key, value] of Object.entries(req.headers)) {
133
+ if (value) {
134
+ headers.set(key, Array.isArray(value) ? value.join(', ') : value);
135
+ }
136
+ }
137
+
138
+ // Collect request body for POST with size limit.
139
+ let body: Uint8Array | undefined;
140
+ if (req.method === 'POST') {
141
+ const collected = await collectRequestBody(req, maxBodySize);
142
+ if (collected === null) {
143
+ res.writeHead(413, { 'Content-Type': 'text/plain' });
144
+ res.end('Payload Too Large');
145
+ return;
146
+ }
147
+ body = collected;
148
+ }
149
+
150
+ const request = new Request(url, {
151
+ method : req.method ?? 'GET',
152
+ headers : headers,
153
+ body : body ?? null,
154
+ });
155
+
156
+ const response = await fetchHandler(request);
157
+
158
+ // Write response back to Node.js ServerResponse.
159
+ const responseHeaders: Record<string, string> = {};
160
+ response.headers.forEach((value, key) => { responseHeaders[key] = value; });
161
+ res.writeHead(response.status, responseHeaders);
162
+ if (response.body) {
163
+ const reader = response.body.getReader();
164
+ try {
165
+ while (true) {
166
+ const { done, value } = await reader.read();
167
+ if (done) { break; }
168
+ res.write(value);
169
+ }
170
+ } finally {
171
+ reader.releaseLock();
172
+ }
173
+ }
174
+ res.end();
175
+ } catch (err) {
176
+ console.error(`Git HTTP handler error: ${(err as Error).message}`);
177
+ res.writeHead(500);
178
+ res.end('Internal Server Error');
179
+ }
180
+ });
181
+
182
+ // Start listening.
183
+ const actualPort = await new Promise<number>((resolve) => {
184
+ server.listen(port, hostname, () => {
185
+ const addr = server.address();
186
+ const boundPort = typeof addr === 'object' && addr !== null ? addr.port : port;
187
+ resolve(boundPort);
188
+ });
189
+ });
190
+
191
+ return {
192
+ port : actualPort,
193
+ backend : backend,
194
+ async stop(): Promise<void> {
195
+ return new Promise((resolve, reject) => {
196
+ server.close((err) => {
197
+ if (err) { reject(err); } else { resolve(); }
198
+ });
199
+ });
200
+ },
201
+ };
202
+ }
203
+
204
+ // ---------------------------------------------------------------------------
205
+ // Helpers
206
+ // ---------------------------------------------------------------------------
207
+
208
+ /**
209
+ * Collect the full request body from a Node.js IncomingMessage.
210
+ * Returns `null` if the body exceeds `maxBytes`.
211
+ */
212
+ function collectRequestBody(req: IncomingMessage, maxBytes: number = DEFAULT_MAX_BODY_GIT): Promise<Uint8Array | null> {
213
+ return new Promise((resolve) => {
214
+ const chunks: Buffer[] = [];
215
+ let totalSize = 0;
216
+ let exceeded = false;
217
+ req.on('data', (chunk: Buffer) => {
218
+ if (exceeded) { return; }
219
+ totalSize += chunk.length;
220
+ if (totalSize > maxBytes) {
221
+ exceeded = true;
222
+ // Stop reading but don't destroy — let the response be sent.
223
+ req.resume();
224
+ resolve(null);
225
+ return;
226
+ }
227
+ chunks.push(chunk);
228
+ });
229
+ req.on('end', () => {
230
+ if (!exceeded) { resolve(new Uint8Array(Buffer.concat(chunks))); }
231
+ });
232
+ req.on('error', () => {
233
+ if (!exceeded) { resolve(null); }
234
+ });
235
+ });
236
+ }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * DID-based signature verification for push authentication.
3
+ *
4
+ * Resolves a DID document, extracts the Ed25519 authentication key,
5
+ * and verifies the signature. This is the production implementation
6
+ * of the `SignatureVerifier` callback used by `createPushAuthenticator`.
7
+ *
8
+ * @module
9
+ */
10
+
11
+ import type { SignatureVerifier } from './auth.js';
12
+
13
+ import { Ed25519 } from '@enbox/crypto';
14
+ import { DidDht, DidJwk, DidKey, DidWeb, UniversalResolver } from '@enbox/dids';
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Resolver
18
+ // ---------------------------------------------------------------------------
19
+
20
+ /** Shared resolver instance (lazy-initialized). */
21
+ let resolver: UniversalResolver | undefined;
22
+
23
+ /** Get or create the DID resolver. */
24
+ function getResolver(): UniversalResolver {
25
+ if (!resolver) {
26
+ resolver = new UniversalResolver({
27
+ didResolvers: [DidDht, DidJwk, DidWeb, DidKey],
28
+ });
29
+ }
30
+ return resolver;
31
+ }
32
+
33
+ // ---------------------------------------------------------------------------
34
+ // Signature verifier
35
+ // ---------------------------------------------------------------------------
36
+
37
+ /**
38
+ * Create a `SignatureVerifier` that resolves a DID and verifies an Ed25519
39
+ * signature against the DID document's authentication verification method.
40
+ *
41
+ * The verifier looks for the first Ed25519 verification method in the DID
42
+ * document's `authentication` purpose (or falls back to `verificationMethod`
43
+ * if no authentication methods are defined).
44
+ *
45
+ * @returns A `SignatureVerifier` callback
46
+ */
47
+ /** DID resolution timeout in milliseconds. */
48
+ const DID_RESOLUTION_TIMEOUT_MS = 30_000;
49
+
50
+ export function createDidSignatureVerifier(): SignatureVerifier {
51
+ return async (did: string, payload: Uint8Array, signature: Uint8Array): Promise<boolean> => {
52
+ try {
53
+ const { didDocument, didResolutionMetadata } = await Promise.race([
54
+ getResolver().resolve(did),
55
+ new Promise<never>((_, reject) =>
56
+ setTimeout(() => reject(new Error(`DID resolution timed out for ${did}`)), DID_RESOLUTION_TIMEOUT_MS),
57
+ ),
58
+ ]);
59
+
60
+ if (didResolutionMetadata.error || !didDocument) {
61
+ return false;
62
+ }
63
+
64
+ // Find an Ed25519 public key from the authentication verification methods.
65
+ const publicKeyJwk = findEd25519AuthKey(didDocument);
66
+ if (!publicKeyJwk) {
67
+ return false;
68
+ }
69
+
70
+ return await Ed25519.verify({
71
+ key : publicKeyJwk,
72
+ data : payload,
73
+ signature : signature,
74
+ });
75
+ } catch {
76
+ return false;
77
+ }
78
+ };
79
+ }
80
+
81
+ // ---------------------------------------------------------------------------
82
+ // Helpers
83
+ // ---------------------------------------------------------------------------
84
+
85
+ /**
86
+ * Find the first Ed25519 public key JWK from a DID document's authentication
87
+ * verification methods.
88
+ */
89
+ function findEd25519AuthKey(didDocument: { verificationMethod?: any[]; authentication?: any[] }): any | undefined {
90
+ const methods = didDocument.verificationMethod ?? [];
91
+
92
+ // If authentication references exist, filter to those methods.
93
+ const authRefs = didDocument.authentication ?? [];
94
+ const authMethodIds = new Set<string>();
95
+ for (const ref of authRefs) {
96
+ if (typeof ref === 'string') {
97
+ authMethodIds.add(ref);
98
+ } else if (ref?.id) {
99
+ authMethodIds.add(ref.id);
100
+ }
101
+ }
102
+
103
+ // Prefer authentication methods; fall back to all verification methods.
104
+ const candidates = authMethodIds.size > 0
105
+ ? methods.filter((m) => authMethodIds.has(m.id))
106
+ : methods;
107
+
108
+ for (const method of candidates) {
109
+ const jwk = method.publicKeyJwk;
110
+ if (jwk && jwk.kty === 'OKP' && jwk.crv === 'Ed25519' && jwk.x) {
111
+ return jwk;
112
+ }
113
+ }
114
+
115
+ return undefined;
116
+ }
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Shared helpers for the GitHub API compatibility shim.
3
+ *
4
+ * Provides DID-to-numeric-ID hashing, `from` option building, repo
5
+ * record lookup, GitHub-style owner objects, pagination, and standard
6
+ * response headers.
7
+ *
8
+ * @module
9
+ */
10
+
11
+ import type { AgentContext } from '../cli/agent.js';
12
+
13
+ // ---------------------------------------------------------------------------
14
+ // Types
15
+ // ---------------------------------------------------------------------------
16
+
17
+ /** GitHub-style owner sub-object synthesized from a DID. */
18
+ export type GitHubOwner = {
19
+ login : string;
20
+ id : number;
21
+ type : string;
22
+ avatar_url : string;
23
+ html_url : string;
24
+ url : string;
25
+ };
26
+
27
+ /** Repo metadata extracted from a DWN repo record. */
28
+ export type RepoInfo = {
29
+ name : string;
30
+ description : string;
31
+ defaultBranch : string;
32
+ contextId : string;
33
+ visibility : string;
34
+ dateCreated : string;
35
+ timestamp : string;
36
+ };
37
+
38
+ /** Pagination parameters parsed from query string. */
39
+ export type PaginationParams = {
40
+ page : number;
41
+ perPage : number;
42
+ };
43
+
44
+ /** Standard JSON API response shape. */
45
+ export type JsonResponse = {
46
+ status : number;
47
+ headers : Record<string, string>;
48
+ body : string;
49
+ };
50
+
51
+ // ---------------------------------------------------------------------------
52
+ // Numeric ID from DWN identifiers
53
+ // ---------------------------------------------------------------------------
54
+
55
+ /**
56
+ * Deterministic numeric ID from a DWN string identifier.
57
+ *
58
+ * Uses a simple FNV-1a-inspired hash to produce a positive 32-bit
59
+ * integer — sufficient for GitHub API compatibility where consumers
60
+ * expect numeric IDs.
61
+ */
62
+ export function numericId(id: string): number {
63
+ let hash = 2166136261;
64
+ for (let i = 0; i < id.length; i++) {
65
+ hash ^= id.charCodeAt(i);
66
+ hash = Math.imul(hash, 16777619);
67
+ }
68
+ return (hash >>> 0); // ensure unsigned 32-bit
69
+ }
70
+
71
+ // ---------------------------------------------------------------------------
72
+ // DWN query helpers
73
+ // ---------------------------------------------------------------------------
74
+
75
+ /**
76
+ * Build the `from` option for a DWN query. When the target is the
77
+ * local agent's own DID we omit `from`; otherwise set it so the SDK
78
+ * routes the message to the remote DWN.
79
+ */
80
+ export function fromOpt(ctx: AgentContext, targetDid: string): string | undefined {
81
+ return targetDid === ctx.did ? undefined : targetDid;
82
+ }
83
+
84
+ /**
85
+ * Look up the singleton repo record for a target DID. Returns `null`
86
+ * if no repo record exists.
87
+ */
88
+ export async function getRepoRecord(ctx: AgentContext, targetDid: string): Promise<RepoInfo | null> {
89
+ const from = fromOpt(ctx, targetDid);
90
+ const { records } = await ctx.repo.records.query('repo', { from });
91
+ if (records.length === 0) { return null; }
92
+
93
+ const rec = records[0];
94
+ const data = await rec.data.json();
95
+ const tags = rec.tags as Record<string, string> | undefined;
96
+
97
+ return {
98
+ name : data.name ?? 'unnamed',
99
+ description : data.description ?? '',
100
+ defaultBranch : data.defaultBranch ?? 'main',
101
+ contextId : rec.contextId ?? '',
102
+ visibility : tags?.visibility ?? 'public',
103
+ dateCreated : rec.dateCreated,
104
+ timestamp : rec.timestamp,
105
+ };
106
+ }
107
+
108
+ // ---------------------------------------------------------------------------
109
+ // GitHub-style owner object
110
+ // ---------------------------------------------------------------------------
111
+
112
+ /**
113
+ * Build a GitHub-style owner sub-object from a DID. The DID itself is
114
+ * used as the `login` field since DIDs are globally unique identifiers
115
+ * (just like GitHub usernames).
116
+ */
117
+ export function buildOwner(did: string, baseUrl: string): GitHubOwner {
118
+ return {
119
+ login : did,
120
+ id : numericId(did),
121
+ type : 'User',
122
+ avatar_url : '',
123
+ html_url : `${baseUrl}/users/${did}`,
124
+ url : `${baseUrl}/users/${did}`,
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Build the base API URL from request context. Defaults to
130
+ * `http://localhost:<port>` for local development.
131
+ */
132
+ export function buildApiUrl(url: URL): string {
133
+ return `${url.protocol}//${url.host}`;
134
+ }
135
+
136
+ // ---------------------------------------------------------------------------
137
+ // Pagination
138
+ // ---------------------------------------------------------------------------
139
+
140
+ /** Parse `page` and `per_page` from the URL query string. */
141
+ export function parsePagination(url: URL): PaginationParams {
142
+ const page = Math.max(1, parseInt(url.searchParams.get('page') ?? '1', 10));
143
+ const perPage = Math.min(100, Math.max(1, parseInt(url.searchParams.get('per_page') ?? '30', 10)));
144
+ return { page, perPage };
145
+ }
146
+
147
+ /** Apply pagination to an array and return the slice. */
148
+ export function paginate<T>(items: T[], params: PaginationParams): T[] {
149
+ const start = (params.page - 1) * params.perPage;
150
+ return items.slice(start, start + params.perPage);
151
+ }
152
+
153
+ /** Build Link header value for pagination. */
154
+ export function buildLinkHeader(baseUrl: string, path: string, page: number, perPage: number, totalItems: number): string | null {
155
+ const lastPage = Math.max(1, Math.ceil(totalItems / perPage));
156
+ if (lastPage <= 1) { return null; }
157
+
158
+ const links: string[] = [];
159
+ if (page < lastPage) {
160
+ links.push(`<${baseUrl}${path}?page=${page + 1}&per_page=${perPage}>; rel="next"`);
161
+ links.push(`<${baseUrl}${path}?page=${lastPage}&per_page=${perPage}>; rel="last"`);
162
+ }
163
+ if (page > 1) {
164
+ links.push(`<${baseUrl}${path}?page=1&per_page=${perPage}>; rel="first"`);
165
+ links.push(`<${baseUrl}${path}?page=${page - 1}&per_page=${perPage}>; rel="prev"`);
166
+ }
167
+
168
+ return links.length > 0 ? links.join(', ') : null;
169
+ }
170
+
171
+ // ---------------------------------------------------------------------------
172
+ // Response builders
173
+ // ---------------------------------------------------------------------------
174
+
175
+ /** Standard headers for all GitHub API shim responses. */
176
+ export function baseHeaders(): Record<string, string> {
177
+ return {
178
+ 'Content-Type' : 'application/json; charset=utf-8',
179
+ 'X-GitHub-Media-Type' : 'github.v3',
180
+ 'Access-Control-Allow-Origin' : '*',
181
+ 'Access-Control-Allow-Headers' : 'Authorization, Accept, Content-Type',
182
+ 'X-RateLimit-Limit' : '5000',
183
+ 'X-RateLimit-Remaining' : '4999',
184
+ 'X-RateLimit-Reset' : String(Math.floor(Date.now() / 1000) + 3600),
185
+ };
186
+ }
187
+
188
+ /** Build a successful JSON response. */
189
+ export function jsonOk(data: unknown, extraHeaders?: Record<string, string>): JsonResponse {
190
+ return {
191
+ status : 200,
192
+ headers : { ...baseHeaders(), ...extraHeaders },
193
+ body : JSON.stringify(data),
194
+ };
195
+ }
196
+
197
+ /** Build a 404 JSON response. */
198
+ export function jsonNotFound(message: string): JsonResponse {
199
+ return {
200
+ status : 404,
201
+ headers : baseHeaders(),
202
+ body : JSON.stringify({ message, documentation_url: 'https://docs.github.com/rest' }),
203
+ };
204
+ }
205
+
206
+ /** Build a 201 Created JSON response. */
207
+ export function jsonCreated(data: unknown, extraHeaders?: Record<string, string>): JsonResponse {
208
+ return {
209
+ status : 201,
210
+ headers : { ...baseHeaders(), ...extraHeaders },
211
+ body : JSON.stringify(data),
212
+ };
213
+ }
214
+
215
+ /** Build a 422 JSON response (validation error). */
216
+ export function jsonValidationError(message: string): JsonResponse {
217
+ return {
218
+ status : 422,
219
+ headers : baseHeaders(),
220
+ body : JSON.stringify({ message, documentation_url: 'https://docs.github.com/rest' }),
221
+ };
222
+ }
223
+
224
+ /** Build a 405 Method Not Allowed JSON response. */
225
+ export function jsonMethodNotAllowed(message: string): JsonResponse {
226
+ return {
227
+ status : 405,
228
+ headers : baseHeaders(),
229
+ body : JSON.stringify({ message }),
230
+ };
231
+ }
232
+
233
+ // ---------------------------------------------------------------------------
234
+ // Sequential numbering
235
+ // ---------------------------------------------------------------------------
236
+
237
+ /**
238
+ * Get the next sequential issue number.
239
+ * Returns `max(existing numbers) + 1`, or 1 if no issues exist.
240
+ */
241
+ export async function getNextIssueNumber(ctx: AgentContext, repoContextId: string): Promise<number> {
242
+ const { records } = await ctx.issues.records.query('repo/issue', {
243
+ filter: { contextId: repoContextId },
244
+ });
245
+
246
+ let maxNumber = 0;
247
+ for (const rec of records) {
248
+ const recTags = rec.tags as Record<string, string> | undefined;
249
+ const num = parseInt(recTags?.number ?? '0', 10);
250
+ if (num > maxNumber) { maxNumber = num; }
251
+ }
252
+
253
+ return maxNumber + 1;
254
+ }
255
+
256
+ /**
257
+ * Get the next sequential patch number.
258
+ */
259
+ export async function getNextPatchNumber(ctx: AgentContext, repoContextId: string): Promise<number> {
260
+ const { records } = await ctx.patches.records.query('repo/patch', {
261
+ filter: { contextId: repoContextId },
262
+ });
263
+
264
+ let maxNumber = 0;
265
+ for (const rec of records) {
266
+ const recTags = rec.tags as Record<string, string> | undefined;
267
+ const num = parseInt(recTags?.number ?? '0', 10);
268
+ if (num > maxNumber) { maxNumber = num; }
269
+ }
270
+
271
+ return maxNumber + 1;
272
+ }
273
+
274
+ /** Convert an ISO date string to GitHub's ISO 8601 format. */
275
+ export function toISODate(dateStr: string | undefined): string {
276
+ if (!dateStr) { return new Date(0).toISOString(); }
277
+ // DWN dates may already be ISO 8601; normalize to ensure consistency.
278
+ return new Date(dateStr).toISOString();
279
+ }
280
+
281
+ // ---------------------------------------------------------------------------
282
+ // Authentication
283
+ // ---------------------------------------------------------------------------
284
+
285
+ /** Build a 401 Unauthorized JSON response. */
286
+ export function jsonUnauthorized(message: string): JsonResponse {
287
+ return {
288
+ status : 401,
289
+ headers : baseHeaders(),
290
+ body : JSON.stringify({ message }),
291
+ };
292
+ }
293
+
294
+ /**
295
+ * Validate a Bearer token from the Authorization header.
296
+ * Returns `true` if the token matches `GITD_API_TOKEN`, or if
297
+ * no token is configured (open access).
298
+ */
299
+ export function validateBearerToken(authHeader: string | null): boolean {
300
+ const expected = process.env.GITD_API_TOKEN;
301
+ if (!expected) { return true; } // No token configured — open access.
302
+ if (!authHeader?.startsWith('Bearer ')) { return false; }
303
+ const token = authHeader.slice(7);
304
+ // Constant-time comparison to prevent timing attacks.
305
+ if (token.length !== expected.length) { return false; }
306
+ let mismatch = 0;
307
+ for (let i = 0; i < token.length; i++) {
308
+ mismatch |= token.charCodeAt(i) ^ expected.charCodeAt(i);
309
+ }
310
+ return mismatch === 0;
311
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * GitHub API compatibility shim — barrel exports.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ export { handleShimRequest, startShimServer } from './server.js';
8
+ export type { ShimServerOptions } from './server.js';
9
+
10
+ export { handleGetRepo, buildRepoResponse } from './repos.js';
11
+ export { handleCreateIssue, handleCreateIssueComment, handleGetIssue, handleListIssueComments, handleListIssues, handleUpdateIssue } from './issues.js';
12
+ export { handleCreatePull, handleCreatePullReview, handleGetPull, handleListPullReviews, handleListPulls, handleMergePull, handleUpdatePull } from './pulls.js';
13
+ export { handleCreateRelease, handleGetReleaseByTag, handleListReleases } from './releases.js';
14
+ export { handleGetUser } from './users.js';
15
+
16
+ export {
17
+ buildApiUrl,
18
+ buildLinkHeader,
19
+ buildOwner,
20
+ fromOpt,
21
+ getNextIssueNumber,
22
+ getNextPatchNumber,
23
+ getRepoRecord,
24
+ numericId,
25
+ paginate,
26
+ parsePagination,
27
+ toISODate,
28
+ } from './helpers.js';
29
+
30
+ export type {
31
+ GitHubOwner,
32
+ JsonResponse,
33
+ PaginationParams,
34
+ RepoInfo,
35
+ } from './helpers.js';