@dxos/plugin-github 0.7.4 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +784 -0
  3. package/dist/lib/GitHubCapabilities.mjs +10 -0
  4. package/dist/lib/GitHubCapabilities.mjs.map +1 -0
  5. package/dist/lib/GitHubEvents.mjs +15 -0
  6. package/dist/lib/GitHubEvents.mjs.map +1 -0
  7. package/dist/lib/GitHubOperation.mjs +384 -0
  8. package/dist/lib/GitHubOperation.mjs.map +1 -0
  9. package/dist/lib/GitHubPlugin.mjs +16 -0
  10. package/dist/lib/GitHubPlugin.mjs.map +1 -0
  11. package/dist/lib/Walkthrough.mjs +59 -0
  12. package/dist/lib/Walkthrough.mjs.map +1 -0
  13. package/dist/lib/capabilities.browser.mjs +54 -0
  14. package/dist/lib/capabilities.browser.mjs.map +1 -0
  15. package/dist/lib/capabilities.mjs +54 -0
  16. package/dist/lib/capabilities.mjs.map +1 -0
  17. package/dist/lib/capabilities.node.mjs +30 -0
  18. package/dist/lib/capabilities.node.mjs.map +1 -0
  19. package/dist/lib/capabilities.tauri.mjs +54 -0
  20. package/dist/lib/capabilities.tauri.mjs.map +1 -0
  21. package/dist/lib/capabilities.workerd.mjs +30 -0
  22. package/dist/lib/capabilities.workerd.mjs.map +1 -0
  23. package/dist/lib/chunk-ImportPullRequestDialog.mjs +116 -0
  24. package/dist/lib/chunk-ImportPullRequestDialog.mjs.map +1 -0
  25. package/dist/lib/chunk-PLUGIN.mjs +6 -0
  26. package/dist/lib/chunk-PLUGIN.mjs.map +1 -0
  27. package/dist/lib/chunk-PullRequestArticle.mjs +1506 -0
  28. package/dist/lib/chunk-PullRequestArticle.mjs.map +1 -0
  29. package/dist/lib/chunk-PullRequestArticle2.mjs +2 -0
  30. package/dist/lib/chunk-PullRequestCardMenu.mjs +123 -0
  31. package/dist/lib/chunk-PullRequestCardMenu.mjs.map +1 -0
  32. package/dist/lib/chunk-PullRequestsArticle.mjs +594 -0
  33. package/dist/lib/chunk-PullRequestsArticle.mjs.map +1 -0
  34. package/dist/lib/chunk-WalkthroughArticle.mjs +26 -0
  35. package/dist/lib/chunk-WalkthroughArticle.mjs.map +1 -0
  36. package/dist/lib/chunk-add-pull-request-comment.mjs +19 -0
  37. package/dist/lib/chunk-add-pull-request-comment.mjs.map +1 -0
  38. package/dist/lib/chunk-add-pull-request-review-comment.mjs +25 -0
  39. package/dist/lib/chunk-add-pull-request-review-comment.mjs.map +1 -0
  40. package/dist/lib/chunk-app-graph-builder.mjs +39 -0
  41. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  42. package/dist/lib/chunk-connector.mjs +70 -0
  43. package/dist/lib/chunk-connector.mjs.map +1 -0
  44. package/dist/lib/chunk-constants.mjs +11 -0
  45. package/dist/lib/chunk-constants.mjs.map +1 -0
  46. package/dist/lib/chunk-errors.mjs +29 -0
  47. package/dist/lib/chunk-errors.mjs.map +1 -0
  48. package/dist/lib/chunk-generate-walkthrough.mjs +86 -0
  49. package/dist/lib/chunk-generate-walkthrough.mjs.map +1 -0
  50. package/dist/lib/chunk-generate.mjs +719 -0
  51. package/dist/lib/chunk-generate.mjs.map +1 -0
  52. package/dist/lib/chunk-get-pull-request-diff.mjs +25 -0
  53. package/dist/lib/chunk-get-pull-request-diff.mjs.map +1 -0
  54. package/dist/lib/chunk-get-pull-request-status.mjs +29 -0
  55. package/dist/lib/chunk-get-pull-request-status.mjs.map +1 -0
  56. package/dist/lib/chunk-get-repositories.mjs +32 -0
  57. package/dist/lib/chunk-get-repositories.mjs.map +1 -0
  58. package/dist/lib/chunk-github-api.mjs +375 -0
  59. package/dist/lib/chunk-github-api.mjs.map +1 -0
  60. package/dist/lib/chunk-github-link.mjs +59 -0
  61. package/dist/lib/chunk-github-link.mjs.map +1 -0
  62. package/dist/lib/chunk-import-pull-request-from-snapshot.mjs +25 -0
  63. package/dist/lib/chunk-import-pull-request-from-snapshot.mjs.map +1 -0
  64. package/dist/lib/chunk-import-pull-request.mjs +171 -0
  65. package/dist/lib/chunk-import-pull-request.mjs.map +1 -0
  66. package/dist/lib/chunk-link-resolver.mjs +109 -0
  67. package/dist/lib/chunk-link-resolver.mjs.map +1 -0
  68. package/dist/lib/chunk-markdown-extension.mjs +92 -0
  69. package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
  70. package/dist/lib/chunk-materialize-target.mjs +36 -0
  71. package/dist/lib/chunk-materialize-target.mjs.map +1 -0
  72. package/dist/lib/chunk-operation-handler.mjs +12 -0
  73. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  74. package/dist/lib/chunk-page-action.mjs +22 -0
  75. package/dist/lib/chunk-page-action.mjs.map +1 -0
  76. package/dist/lib/chunk-pull-request.mjs +58 -0
  77. package/dist/lib/chunk-pull-request.mjs.map +1 -0
  78. package/dist/lib/chunk-pull-request2.mjs +110 -0
  79. package/dist/lib/chunk-pull-request2.mjs.map +1 -0
  80. package/dist/lib/chunk-react-surface.mjs +233 -0
  81. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  82. package/dist/lib/chunk-refresh-pull-requests.mjs +49 -0
  83. package/dist/lib/chunk-refresh-pull-requests.mjs.map +1 -0
  84. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  85. package/dist/lib/chunk-schema.mjs +15 -0
  86. package/dist/lib/chunk-schema.mjs.map +1 -0
  87. package/dist/lib/chunk-skill-definition.mjs +10 -0
  88. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  89. package/dist/lib/chunk-submit-pull-request-approval.mjs +56 -0
  90. package/dist/lib/chunk-submit-pull-request-approval.mjs.map +1 -0
  91. package/dist/lib/chunk-sync-pull-request.mjs +26 -0
  92. package/dist/lib/chunk-sync-pull-request.mjs.map +1 -0
  93. package/dist/lib/chunk-sync.mjs +481 -0
  94. package/dist/lib/chunk-sync.mjs.map +1 -0
  95. package/dist/lib/chunk-useOpenObject.mjs +43 -0
  96. package/dist/lib/chunk-useOpenObject.mjs.map +1 -0
  97. package/dist/lib/extensions.mjs +132 -0
  98. package/dist/lib/extensions.mjs.map +1 -0
  99. package/dist/lib/index.mjs +4 -0
  100. package/dist/lib/meta.mjs +47 -0
  101. package/dist/lib/meta.mjs.map +1 -0
  102. package/dist/lib/ns/Extensions.mjs +18 -0
  103. package/dist/lib/ns/Extensions.mjs.map +1 -0
  104. package/dist/lib/operations.mjs +23 -0
  105. package/dist/lib/operations.mjs.map +1 -0
  106. package/dist/lib/plugin.mjs +9 -0
  107. package/dist/lib/plugin.mjs.map +1 -0
  108. package/dist/lib/skills.mjs +44 -0
  109. package/dist/lib/skills.mjs.map +1 -0
  110. package/dist/lib/testing.mjs +189 -0
  111. package/dist/lib/testing.mjs.map +1 -0
  112. package/dist/lib/translations.mjs +136 -0
  113. package/dist/lib/translations.mjs.map +1 -0
  114. package/dist/lib/types.mjs +5 -0
  115. package/dist/types/dx.config.d.ts +28 -0
  116. package/dist/types/dx.config.d.ts.map +1 -0
  117. package/dist/types/src/Extensions.d.ts +2 -0
  118. package/dist/types/src/Extensions.d.ts.map +1 -0
  119. package/dist/types/src/GitHubPlugin.d.ts +37 -0
  120. package/dist/types/src/GitHubPlugin.d.ts.map +1 -0
  121. package/dist/types/src/GitHubPlugin.workerd.test.d.ts +2 -0
  122. package/dist/types/src/GitHubPlugin.workerd.test.d.ts.map +1 -0
  123. package/dist/types/src/approval.d.ts +21 -0
  124. package/dist/types/src/approval.d.ts.map +1 -0
  125. package/dist/types/src/approval.test.d.ts +2 -0
  126. package/dist/types/src/approval.test.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/app-graph-builder.d.ts +9 -0
  128. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/connector.d.ts +17 -0
  130. package/dist/types/src/capabilities/connector.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/gen/browser.d.ts +13 -0
  132. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/gen/node.d.ts +13 -0
  134. package/dist/types/src/capabilities/gen/node.d.ts.map +1 -0
  135. package/dist/types/src/capabilities/gen/tauri.d.ts +13 -0
  136. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/gen/workerd.d.ts +13 -0
  138. package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -0
  139. package/dist/types/src/capabilities/index.d.ts +13 -0
  140. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  141. package/dist/types/src/capabilities/link-resolver.d.ts +10 -0
  142. package/dist/types/src/capabilities/link-resolver.d.ts.map +1 -0
  143. package/dist/types/src/capabilities/markdown-extension.d.ts +14 -0
  144. package/dist/types/src/capabilities/markdown-extension.d.ts.map +1 -0
  145. package/dist/types/src/capabilities/operation-handler.d.ts +5 -0
  146. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  147. package/dist/types/src/capabilities/page-action.d.ts +5 -0
  148. package/dist/types/src/capabilities/page-action.d.ts.map +1 -0
  149. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  150. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  151. package/dist/types/src/capabilities/schema.d.ts +12 -0
  152. package/dist/types/src/capabilities/schema.d.ts.map +1 -0
  153. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  154. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  155. package/dist/types/src/cards/GitHubCard.d.ts +11 -0
  156. package/dist/types/src/cards/GitHubCard.d.ts.map +1 -0
  157. package/dist/types/src/cards/GitHubCard.stories.d.ts +45 -0
  158. package/dist/types/src/cards/GitHubCard.stories.d.ts.map +1 -0
  159. package/dist/types/src/cards/PullRequestCard.d.ts +9 -0
  160. package/dist/types/src/cards/PullRequestCard.d.ts.map +1 -0
  161. package/dist/types/src/cards/index.d.ts +3 -0
  162. package/dist/types/src/cards/index.d.ts.map +1 -0
  163. package/dist/types/src/components/CommentComposer/CommentComposer.d.ts +30 -0
  164. package/dist/types/src/components/CommentComposer/CommentComposer.d.ts.map +1 -0
  165. package/dist/types/src/components/CommentComposer/index.d.ts +2 -0
  166. package/dist/types/src/components/CommentComposer/index.d.ts.map +1 -0
  167. package/dist/types/src/components/PullRequestFiles/DiffStat.d.ts +8 -0
  168. package/dist/types/src/components/PullRequestFiles/DiffStat.d.ts.map +1 -0
  169. package/dist/types/src/components/PullRequestFiles/FileTree.d.ts +17 -0
  170. package/dist/types/src/components/PullRequestFiles/FileTree.d.ts.map +1 -0
  171. package/dist/types/src/components/PullRequestFiles/PullRequestFiles.d.ts +23 -0
  172. package/dist/types/src/components/PullRequestFiles/PullRequestFiles.d.ts.map +1 -0
  173. package/dist/types/src/components/PullRequestFiles/files.d.ts +39 -0
  174. package/dist/types/src/components/PullRequestFiles/files.d.ts.map +1 -0
  175. package/dist/types/src/components/PullRequestFiles/files.test.d.ts +2 -0
  176. package/dist/types/src/components/PullRequestFiles/files.test.d.ts.map +1 -0
  177. package/dist/types/src/components/PullRequestFiles/index.d.ts +5 -0
  178. package/dist/types/src/components/PullRequestFiles/index.d.ts.map +1 -0
  179. package/dist/types/src/components/PullRequestOverview/ArtifactPill.d.ts +21 -0
  180. package/dist/types/src/components/PullRequestOverview/ArtifactPill.d.ts.map +1 -0
  181. package/dist/types/src/components/PullRequestOverview/CheckRunList.d.ts +18 -0
  182. package/dist/types/src/components/PullRequestOverview/CheckRunList.d.ts.map +1 -0
  183. package/dist/types/src/components/PullRequestOverview/CheckRunList.test.d.ts +2 -0
  184. package/dist/types/src/components/PullRequestOverview/CheckRunList.test.d.ts.map +1 -0
  185. package/dist/types/src/components/PullRequestOverview/PullRequestDetails.d.ts +10 -0
  186. package/dist/types/src/components/PullRequestOverview/PullRequestDetails.d.ts.map +1 -0
  187. package/dist/types/src/components/PullRequestOverview/PullRequestOverview.d.ts +16 -0
  188. package/dist/types/src/components/PullRequestOverview/PullRequestOverview.d.ts.map +1 -0
  189. package/dist/types/src/components/PullRequestOverview/RelatedCards.d.ts +28 -0
  190. package/dist/types/src/components/PullRequestOverview/RelatedCards.d.ts.map +1 -0
  191. package/dist/types/src/components/PullRequestOverview/index.d.ts +6 -0
  192. package/dist/types/src/components/PullRequestOverview/index.d.ts.map +1 -0
  193. package/dist/types/src/components/PullRequestStatus/PullRequestStatus.d.ts +20 -0
  194. package/dist/types/src/components/PullRequestStatus/PullRequestStatus.d.ts.map +1 -0
  195. package/dist/types/src/components/PullRequestStatus/index.d.ts +2 -0
  196. package/dist/types/src/components/PullRequestStatus/index.d.ts.map +1 -0
  197. package/dist/types/src/components/WalkthroughView/WalkthroughView.d.ts +18 -0
  198. package/dist/types/src/components/WalkthroughView/WalkthroughView.d.ts.map +1 -0
  199. package/dist/types/src/components/WalkthroughView/extensions.d.ts +16 -0
  200. package/dist/types/src/components/WalkthroughView/extensions.d.ts.map +1 -0
  201. package/dist/types/src/components/WalkthroughView/index.d.ts +3 -0
  202. package/dist/types/src/components/WalkthroughView/index.d.ts.map +1 -0
  203. package/dist/types/src/components/index.d.ts +5 -8
  204. package/dist/types/src/components/index.d.ts.map +1 -1
  205. package/dist/types/src/constants.d.ts +7 -0
  206. package/dist/types/src/constants.d.ts.map +1 -0
  207. package/dist/types/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.d.ts +6 -0
  208. package/dist/types/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.d.ts.map +1 -0
  209. package/dist/types/src/containers/ImportPullRequestDialog/index.d.ts +3 -0
  210. package/dist/types/src/containers/ImportPullRequestDialog/index.d.ts.map +1 -0
  211. package/dist/types/src/containers/PullRequestArticle/PullRequestArticle.d.ts +15 -0
  212. package/dist/types/src/containers/PullRequestArticle/PullRequestArticle.d.ts.map +1 -0
  213. package/dist/types/src/containers/PullRequestArticle/failure.d.ts +10 -0
  214. package/dist/types/src/containers/PullRequestArticle/failure.d.ts.map +1 -0
  215. package/dist/types/src/containers/PullRequestArticle/failure.test.d.ts +2 -0
  216. package/dist/types/src/containers/PullRequestArticle/failure.test.d.ts.map +1 -0
  217. package/dist/types/src/containers/PullRequestArticle/index.d.ts +2 -0
  218. package/dist/types/src/containers/PullRequestArticle/index.d.ts.map +1 -0
  219. package/dist/types/src/containers/PullRequestCardMenu/PullRequestCardMenu.d.ts +14 -0
  220. package/dist/types/src/containers/PullRequestCardMenu/PullRequestCardMenu.d.ts.map +1 -0
  221. package/dist/types/src/containers/PullRequestCardMenu/index.d.ts +2 -0
  222. package/dist/types/src/containers/PullRequestCardMenu/index.d.ts.map +1 -0
  223. package/dist/types/src/containers/PullRequestsArticle/PullRequestsArticle.d.ts +13 -0
  224. package/dist/types/src/containers/PullRequestsArticle/PullRequestsArticle.d.ts.map +1 -0
  225. package/dist/types/src/containers/PullRequestsArticle/arrange.d.ts +44 -0
  226. package/dist/types/src/containers/PullRequestsArticle/arrange.d.ts.map +1 -0
  227. package/dist/types/src/containers/PullRequestsArticle/arrange.test.d.ts +2 -0
  228. package/dist/types/src/containers/PullRequestsArticle/arrange.test.d.ts.map +1 -0
  229. package/dist/types/src/containers/PullRequestsArticle/format.d.ts +3 -0
  230. package/dist/types/src/containers/PullRequestsArticle/format.d.ts.map +1 -0
  231. package/dist/types/src/containers/PullRequestsArticle/index.d.ts +2 -0
  232. package/dist/types/src/containers/PullRequestsArticle/index.d.ts.map +1 -0
  233. package/dist/types/src/containers/WalkthroughArticle/WalkthroughArticle.d.ts +13 -0
  234. package/dist/types/src/containers/WalkthroughArticle/WalkthroughArticle.d.ts.map +1 -0
  235. package/dist/types/src/containers/WalkthroughArticle/index.d.ts +2 -0
  236. package/dist/types/src/containers/WalkthroughArticle/index.d.ts.map +1 -0
  237. package/dist/types/src/containers/index.d.ts +7 -0
  238. package/dist/types/src/containers/index.d.ts.map +1 -0
  239. package/dist/types/src/errors.d.ts +157 -0
  240. package/dist/types/src/errors.d.ts.map +1 -0
  241. package/dist/types/src/extensions/index.d.ts +3 -0
  242. package/dist/types/src/extensions/index.d.ts.map +1 -0
  243. package/dist/types/src/extensions/links.d.ts +21 -0
  244. package/dist/types/src/extensions/links.d.ts.map +1 -0
  245. package/dist/types/src/extensions/links.test.d.ts +2 -0
  246. package/dist/types/src/extensions/links.test.d.ts.map +1 -0
  247. package/dist/types/src/extensions/references.d.ts +23 -0
  248. package/dist/types/src/extensions/references.d.ts.map +1 -0
  249. package/dist/types/src/extensions/references.test.d.ts +2 -0
  250. package/dist/types/src/extensions/references.test.d.ts.map +1 -0
  251. package/dist/types/src/github-link.d.ts +29 -0
  252. package/dist/types/src/github-link.d.ts.map +1 -0
  253. package/dist/types/src/hooks/index.d.ts +5 -2
  254. package/dist/types/src/hooks/index.d.ts.map +1 -1
  255. package/dist/types/src/hooks/useOpenObject.d.ts +9 -0
  256. package/dist/types/src/hooks/useOpenObject.d.ts.map +1 -0
  257. package/dist/types/src/hooks/usePullRequestChecks.d.ts +10 -0
  258. package/dist/types/src/hooks/usePullRequestChecks.d.ts.map +1 -0
  259. package/dist/types/src/hooks/usePullRequestDiff.d.ts +12 -0
  260. package/dist/types/src/hooks/usePullRequestDiff.d.ts.map +1 -0
  261. package/dist/types/src/hooks/usePullRequestFiles.d.ts +22 -0
  262. package/dist/types/src/hooks/usePullRequestFiles.d.ts.map +1 -0
  263. package/dist/types/src/hooks/useSyncPullRequest.d.ts +10 -0
  264. package/dist/types/src/hooks/useSyncPullRequest.d.ts.map +1 -0
  265. package/dist/types/src/index.d.ts +3 -3
  266. package/dist/types/src/index.d.ts.map +1 -1
  267. package/dist/types/src/meta.d.ts +34 -11
  268. package/dist/types/src/meta.d.ts.map +1 -1
  269. package/dist/types/src/operations/add-pull-request-comment.d.ts +5 -0
  270. package/dist/types/src/operations/add-pull-request-comment.d.ts.map +1 -0
  271. package/dist/types/src/operations/add-pull-request-review-comment.d.ts +5 -0
  272. package/dist/types/src/operations/add-pull-request-review-comment.d.ts.map +1 -0
  273. package/dist/types/src/operations/generate-walkthrough.d.ts +11 -0
  274. package/dist/types/src/operations/generate-walkthrough.d.ts.map +1 -0
  275. package/dist/types/src/operations/get-pull-request-diff.d.ts +5 -0
  276. package/dist/types/src/operations/get-pull-request-diff.d.ts.map +1 -0
  277. package/dist/types/src/operations/get-pull-request-status.d.ts +5 -0
  278. package/dist/types/src/operations/get-pull-request-status.d.ts.map +1 -0
  279. package/dist/types/src/operations/get-repositories.d.ts +13 -0
  280. package/dist/types/src/operations/get-repositories.d.ts.map +1 -0
  281. package/dist/types/src/operations/import-pull-request-from-snapshot.d.ts +12 -0
  282. package/dist/types/src/operations/import-pull-request-from-snapshot.d.ts.map +1 -0
  283. package/dist/types/src/operations/import-pull-request.d.ts +63 -0
  284. package/dist/types/src/operations/import-pull-request.d.ts.map +1 -0
  285. package/dist/types/src/operations/import-pull-request.test.d.ts +2 -0
  286. package/dist/types/src/operations/import-pull-request.test.d.ts.map +1 -0
  287. package/dist/types/src/operations/index.d.ts +3 -0
  288. package/dist/types/src/operations/index.d.ts.map +1 -0
  289. package/dist/types/src/operations/materialize-target.d.ts +12 -0
  290. package/dist/types/src/operations/materialize-target.d.ts.map +1 -0
  291. package/dist/types/src/operations/pull-request.d.ts +48 -0
  292. package/dist/types/src/operations/pull-request.d.ts.map +1 -0
  293. package/dist/types/src/operations/pull-request.test.d.ts +2 -0
  294. package/dist/types/src/operations/pull-request.test.d.ts.map +1 -0
  295. package/dist/types/src/operations/refresh-pull-requests.d.ts +5 -0
  296. package/dist/types/src/operations/refresh-pull-requests.d.ts.map +1 -0
  297. package/dist/types/src/operations/refresh.d.ts +37 -0
  298. package/dist/types/src/operations/refresh.d.ts.map +1 -0
  299. package/dist/types/src/operations/refresh.test.d.ts +2 -0
  300. package/dist/types/src/operations/refresh.test.d.ts.map +1 -0
  301. package/dist/types/src/operations/submit-pull-request-approval.d.ts +5 -0
  302. package/dist/types/src/operations/submit-pull-request-approval.d.ts.map +1 -0
  303. package/dist/types/src/operations/sync-pull-request.d.ts +5 -0
  304. package/dist/types/src/operations/sync-pull-request.d.ts.map +1 -0
  305. package/dist/types/src/operations/sync.d.ts +123 -0
  306. package/dist/types/src/operations/sync.d.ts.map +1 -0
  307. package/dist/types/src/operations/sync.test.d.ts +2 -0
  308. package/dist/types/src/operations/sync.test.d.ts.map +1 -0
  309. package/dist/types/src/plugin.d.ts +4 -0
  310. package/dist/types/src/plugin.d.ts.map +1 -0
  311. package/dist/types/src/plugin.test.d.ts +2 -0
  312. package/dist/types/src/plugin.test.d.ts.map +1 -0
  313. package/dist/types/src/pull-request-body.d.ts +37 -0
  314. package/dist/types/src/pull-request-body.d.ts.map +1 -0
  315. package/dist/types/src/pull-request-body.test.d.ts +2 -0
  316. package/dist/types/src/pull-request-body.test.d.ts.map +1 -0
  317. package/dist/types/src/pull-request.d.ts +28 -0
  318. package/dist/types/src/pull-request.d.ts.map +1 -0
  319. package/dist/types/src/pull-request.test.d.ts +2 -0
  320. package/dist/types/src/pull-request.test.d.ts.map +1 -0
  321. package/dist/types/src/services/github-api.d.ts +332 -0
  322. package/dist/types/src/services/github-api.d.ts.map +1 -0
  323. package/dist/types/src/services/index.d.ts +2 -0
  324. package/dist/types/src/services/index.d.ts.map +1 -0
  325. package/dist/types/src/skills/GitHubSkill.d.ts +12 -0
  326. package/dist/types/src/skills/GitHubSkill.d.ts.map +1 -0
  327. package/dist/types/src/skills/index.d.ts +2 -0
  328. package/dist/types/src/skills/index.d.ts.map +1 -0
  329. package/dist/types/src/stories/Generate.stories.d.ts +27 -0
  330. package/dist/types/src/stories/Generate.stories.d.ts.map +1 -0
  331. package/dist/types/src/stories/Links.stories.d.ts +23 -0
  332. package/dist/types/src/stories/Links.stories.d.ts.map +1 -0
  333. package/dist/types/src/stories/PullRequestArticle.stories.d.ts +359 -0
  334. package/dist/types/src/stories/PullRequestArticle.stories.d.ts.map +1 -0
  335. package/dist/types/src/stories/PullRequestFiles.stories.d.ts +365 -0
  336. package/dist/types/src/stories/PullRequestFiles.stories.d.ts.map +1 -0
  337. package/dist/types/src/stories/PullRequestOverview.stories.d.ts +367 -0
  338. package/dist/types/src/stories/PullRequestOverview.stories.d.ts.map +1 -0
  339. package/dist/types/src/stories/PullRequestsArticle.stories.d.ts +357 -0
  340. package/dist/types/src/stories/PullRequestsArticle.stories.d.ts.map +1 -0
  341. package/dist/types/src/stories/Walkthrough.stories.d.ts +380 -0
  342. package/dist/types/src/stories/Walkthrough.stories.d.ts.map +1 -0
  343. package/dist/types/src/stories/github.d.ts +23 -0
  344. package/dist/types/src/stories/github.d.ts.map +1 -0
  345. package/dist/types/src/stories/github.test.d.ts +2 -0
  346. package/dist/types/src/stories/github.test.d.ts.map +1 -0
  347. package/dist/types/src/stories/walkthrough-fixture.d.ts +8 -0
  348. package/dist/types/src/stories/walkthrough-fixture.d.ts.map +1 -0
  349. package/dist/types/src/testing/fixtures.d.ts +14 -0
  350. package/dist/types/src/testing/fixtures.d.ts.map +1 -0
  351. package/dist/types/src/testing/index.d.ts +4 -0
  352. package/dist/types/src/testing/index.d.ts.map +1 -0
  353. package/dist/types/src/testing/plugin.d.ts +4 -0
  354. package/dist/types/src/testing/plugin.d.ts.map +1 -0
  355. package/dist/types/src/testing/pull-request-13348.d.ts +6 -0
  356. package/dist/types/src/testing/pull-request-13348.d.ts.map +1 -0
  357. package/dist/types/src/translations.d.ts +339 -53
  358. package/dist/types/src/translations.d.ts.map +1 -1
  359. package/dist/types/src/types/GitHubCapabilities.d.ts +13 -0
  360. package/dist/types/src/types/GitHubCapabilities.d.ts.map +1 -0
  361. package/dist/types/src/types/GitHubEvents.d.ts +8 -0
  362. package/dist/types/src/types/GitHubEvents.d.ts.map +1 -0
  363. package/dist/types/src/types/GitHubOperation.d.ts +281 -0
  364. package/dist/types/src/types/GitHubOperation.d.ts.map +1 -0
  365. package/dist/types/src/types/PullRequestsView.d.ts +35 -0
  366. package/dist/types/src/types/PullRequestsView.d.ts.map +1 -0
  367. package/dist/types/src/types/Walkthrough.d.ts +31 -0
  368. package/dist/types/src/types/Walkthrough.d.ts.map +1 -0
  369. package/dist/types/src/types/Walkthrough.test.d.ts +2 -0
  370. package/dist/types/src/types/Walkthrough.test.d.ts.map +1 -0
  371. package/dist/types/src/types/index.d.ts +5 -0
  372. package/dist/types/src/types/index.d.ts.map +1 -0
  373. package/dist/types/src/walkthrough/fill.d.ts +28 -0
  374. package/dist/types/src/walkthrough/fill.d.ts.map +1 -0
  375. package/dist/types/src/walkthrough/fill.test.d.ts +2 -0
  376. package/dist/types/src/walkthrough/fill.test.d.ts.map +1 -0
  377. package/dist/types/src/walkthrough/generate.d.ts +67 -0
  378. package/dist/types/src/walkthrough/generate.d.ts.map +1 -0
  379. package/dist/types/src/walkthrough/generate.test.d.ts +2 -0
  380. package/dist/types/src/walkthrough/generate.test.d.ts.map +1 -0
  381. package/dist/types/src/walkthrough/generated.d.ts +20 -0
  382. package/dist/types/src/walkthrough/generated.d.ts.map +1 -0
  383. package/dist/types/src/walkthrough/generated.test.d.ts +2 -0
  384. package/dist/types/src/walkthrough/generated.test.d.ts.map +1 -0
  385. package/dist/types/src/walkthrough/headings.d.ts +8 -0
  386. package/dist/types/src/walkthrough/headings.d.ts.map +1 -0
  387. package/dist/types/src/walkthrough/headings.test.d.ts +2 -0
  388. package/dist/types/src/walkthrough/headings.test.d.ts.map +1 -0
  389. package/dist/types/src/walkthrough/index.d.ts +9 -0
  390. package/dist/types/src/walkthrough/index.d.ts.map +1 -0
  391. package/dist/types/src/walkthrough/patch.d.ts +48 -0
  392. package/dist/types/src/walkthrough/patch.d.ts.map +1 -0
  393. package/dist/types/src/walkthrough/plan.d.ts +55 -0
  394. package/dist/types/src/walkthrough/plan.d.ts.map +1 -0
  395. package/dist/types/src/walkthrough/plan.test.d.ts +2 -0
  396. package/dist/types/src/walkthrough/plan.test.d.ts.map +1 -0
  397. package/dist/types/src/walkthrough/prompt.d.ts +33 -0
  398. package/dist/types/src/walkthrough/prompt.d.ts.map +1 -0
  399. package/dist/types/src/walkthrough/prompt.test.d.ts +2 -0
  400. package/dist/types/src/walkthrough/prompt.test.d.ts.map +1 -0
  401. package/dist/types/src/walkthrough/score.d.ts +43 -0
  402. package/dist/types/src/walkthrough/score.d.ts.map +1 -0
  403. package/dist/types/src/walkthrough/score.test.d.ts +2 -0
  404. package/dist/types/src/walkthrough/score.test.d.ts.map +1 -0
  405. package/dist/types/tsconfig.tsbuildinfo +1 -0
  406. package/dx.config.ts +39 -0
  407. package/package.json +167 -48
  408. package/src/Extensions.ts +7 -0
  409. package/src/GitHubPlugin.ts +15 -0
  410. package/src/GitHubPlugin.workerd.test.ts +23 -0
  411. package/src/approval.test.ts +40 -0
  412. package/src/approval.ts +39 -0
  413. package/src/capabilities/app-graph-builder.ts +47 -0
  414. package/src/capabilities/connector.ts +95 -0
  415. package/src/capabilities/gen/browser.ts +82 -0
  416. package/src/capabilities/gen/node.ts +43 -0
  417. package/src/capabilities/gen/tauri.ts +82 -0
  418. package/src/capabilities/gen/workerd.ts +43 -0
  419. package/src/capabilities/index.ts +71 -0
  420. package/src/capabilities/link-resolver.ts +137 -0
  421. package/src/capabilities/markdown-extension.ts +146 -0
  422. package/src/capabilities/operation-handler.ts +16 -0
  423. package/src/capabilities/page-action.ts +32 -0
  424. package/src/capabilities/react-surface.ts +98 -0
  425. package/src/capabilities/schema.ts +16 -0
  426. package/src/capabilities/skill-definition.ts +14 -0
  427. package/src/cards/GitHubCard.stories.tsx +165 -0
  428. package/src/cards/GitHubCard.tsx +93 -0
  429. package/src/cards/PullRequestCard.tsx +23 -0
  430. package/src/cards/index.ts +6 -0
  431. package/src/components/CommentComposer/CommentComposer.tsx +109 -0
  432. package/src/components/CommentComposer/index.ts +5 -0
  433. package/src/components/PullRequestFiles/DiffStat.tsx +15 -0
  434. package/src/components/PullRequestFiles/FileTree.tsx +102 -0
  435. package/src/components/PullRequestFiles/PullRequestFiles.tsx +87 -0
  436. package/src/components/PullRequestFiles/files.test.ts +59 -0
  437. package/src/components/PullRequestFiles/files.ts +115 -0
  438. package/src/components/PullRequestFiles/index.ts +8 -0
  439. package/src/components/PullRequestOverview/ArtifactPill.tsx +82 -0
  440. package/src/components/PullRequestOverview/CheckRunList.test.ts +29 -0
  441. package/src/components/PullRequestOverview/CheckRunList.tsx +141 -0
  442. package/src/components/PullRequestOverview/PullRequestDetails.tsx +15 -0
  443. package/src/components/PullRequestOverview/PullRequestOverview.tsx +110 -0
  444. package/src/components/PullRequestOverview/RelatedCards.tsx +147 -0
  445. package/src/components/PullRequestOverview/index.ts +9 -0
  446. package/src/components/PullRequestStatus/PullRequestStatus.tsx +84 -0
  447. package/src/components/PullRequestStatus/index.ts +5 -0
  448. package/src/components/WalkthroughView/WalkthroughView.tsx +62 -0
  449. package/src/components/WalkthroughView/extensions.ts +53 -0
  450. package/src/components/WalkthroughView/index.ts +6 -0
  451. package/src/components/index.ts +6 -9
  452. package/src/constants.ts +12 -0
  453. package/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.tsx +160 -0
  454. package/src/containers/ImportPullRequestDialog/index.ts +7 -0
  455. package/src/containers/PullRequestArticle/PullRequestArticle.tsx +573 -0
  456. package/src/containers/PullRequestArticle/failure.test.ts +42 -0
  457. package/src/containers/PullRequestArticle/failure.ts +16 -0
  458. package/src/containers/PullRequestArticle/index.ts +5 -0
  459. package/src/containers/PullRequestCardMenu/PullRequestCardMenu.tsx +134 -0
  460. package/src/containers/PullRequestCardMenu/index.ts +5 -0
  461. package/src/containers/PullRequestsArticle/PullRequestsArticle.tsx +361 -0
  462. package/src/containers/PullRequestsArticle/arrange.test.ts +122 -0
  463. package/src/containers/PullRequestsArticle/arrange.ts +245 -0
  464. package/src/containers/PullRequestsArticle/format.ts +31 -0
  465. package/src/containers/PullRequestsArticle/index.ts +5 -0
  466. package/src/containers/WalkthroughArticle/WalkthroughArticle.tsx +31 -0
  467. package/src/containers/WalkthroughArticle/index.ts +5 -0
  468. package/src/containers/index.ts +11 -0
  469. package/src/errors.ts +61 -0
  470. package/src/extensions/index.ts +6 -0
  471. package/src/extensions/links.test.ts +133 -0
  472. package/src/extensions/links.ts +91 -0
  473. package/src/extensions/references.test.ts +83 -0
  474. package/src/extensions/references.ts +100 -0
  475. package/src/github-link.ts +70 -0
  476. package/src/hooks/index.ts +6 -3
  477. package/src/hooks/useOpenObject.ts +48 -0
  478. package/src/hooks/usePullRequestChecks.ts +81 -0
  479. package/src/hooks/usePullRequestDiff.ts +57 -0
  480. package/src/hooks/usePullRequestFiles.ts +98 -0
  481. package/src/hooks/useSyncPullRequest.ts +51 -0
  482. package/src/index.ts +4 -6
  483. package/src/meta.ts +8 -13
  484. package/src/operations/add-pull-request-comment.ts +31 -0
  485. package/src/operations/add-pull-request-review-comment.ts +32 -0
  486. package/src/operations/generate-walkthrough.ts +124 -0
  487. package/src/operations/get-pull-request-diff.ts +37 -0
  488. package/src/operations/get-pull-request-status.ts +44 -0
  489. package/src/operations/get-repositories.ts +53 -0
  490. package/src/operations/import-pull-request-from-snapshot.ts +48 -0
  491. package/src/operations/import-pull-request.test.ts +151 -0
  492. package/src/operations/import-pull-request.ts +149 -0
  493. package/src/operations/index.ts +30 -0
  494. package/src/operations/materialize-target.ts +60 -0
  495. package/src/operations/pull-request.test.ts +120 -0
  496. package/src/operations/pull-request.ts +141 -0
  497. package/src/operations/refresh-pull-requests.ts +69 -0
  498. package/src/operations/refresh.test.ts +112 -0
  499. package/src/operations/refresh.ts +111 -0
  500. package/src/operations/submit-pull-request-approval.ts +41 -0
  501. package/src/operations/sync-pull-request.ts +34 -0
  502. package/src/operations/sync.test.ts +453 -0
  503. package/src/operations/sync.ts +807 -0
  504. package/src/plugin.test.ts +40 -0
  505. package/src/plugin.ts +37 -0
  506. package/src/pull-request-body.test.ts +61 -0
  507. package/src/pull-request-body.ts +144 -0
  508. package/src/pull-request.test.ts +67 -0
  509. package/src/pull-request.ts +80 -0
  510. package/src/services/github-api.ts +735 -0
  511. package/src/services/index.ts +5 -0
  512. package/src/skills/GitHubSkill.ts +46 -0
  513. package/src/skills/index.ts +5 -0
  514. package/src/stories/Generate.stories.tsx +152 -0
  515. package/src/stories/Links.stories.tsx +153 -0
  516. package/src/stories/PullRequestArticle.stories.tsx +107 -0
  517. package/src/stories/PullRequestFiles.stories.tsx +69 -0
  518. package/src/stories/PullRequestOverview.stories.tsx +114 -0
  519. package/src/stories/PullRequestsArticle.stories.tsx +170 -0
  520. package/src/stories/Walkthrough.stories.tsx +110 -0
  521. package/src/stories/github.test.ts +65 -0
  522. package/src/stories/github.ts +70 -0
  523. package/src/stories/walkthrough-fixture.ts +115 -0
  524. package/src/testing/fixtures.ts +99 -0
  525. package/src/testing/index.ts +7 -0
  526. package/src/testing/plugin.ts +25 -0
  527. package/src/testing/pull-request-13348.ts +104 -0
  528. package/src/testing/pull-request-13363.patch +2981 -0
  529. package/src/translations.ts +135 -63
  530. package/src/types/GitHubCapabilities.ts +27 -0
  531. package/src/types/GitHubEvents.ts +16 -0
  532. package/src/types/GitHubOperation.ts +397 -0
  533. package/src/types/PullRequestsView.ts +45 -0
  534. package/src/types/Walkthrough.test.ts +75 -0
  535. package/src/types/Walkthrough.ts +66 -0
  536. package/src/types/index.ts +8 -0
  537. package/src/vite-env.d.ts +15 -0
  538. package/src/walkthrough/fill.test.ts +337 -0
  539. package/src/walkthrough/fill.ts +246 -0
  540. package/src/walkthrough/generate.test.ts +219 -0
  541. package/src/walkthrough/generate.ts +248 -0
  542. package/src/walkthrough/generated.test.ts +70 -0
  543. package/src/walkthrough/generated.ts +70 -0
  544. package/src/walkthrough/headings.test.ts +40 -0
  545. package/src/walkthrough/headings.ts +39 -0
  546. package/src/walkthrough/index.ts +12 -0
  547. package/src/walkthrough/patch.ts +154 -0
  548. package/src/walkthrough/plan.test.ts +178 -0
  549. package/src/walkthrough/plan.ts +251 -0
  550. package/src/walkthrough/prompt.test.ts +100 -0
  551. package/src/walkthrough/prompt.ts +147 -0
  552. package/src/walkthrough/score.test.ts +272 -0
  553. package/src/walkthrough/score.ts +430 -0
  554. package/README.md +0 -15
  555. package/dist/lib/browser/chunk-S4MPSBA5.mjs +0 -21
  556. package/dist/lib/browser/chunk-S4MPSBA5.mjs.map +0 -7
  557. package/dist/lib/browser/index.css +0 -7
  558. package/dist/lib/browser/index.css.map +0 -7
  559. package/dist/lib/browser/index.mjs +0 -1535
  560. package/dist/lib/browser/index.mjs.map +0 -7
  561. package/dist/lib/browser/meta.json +0 -1
  562. package/dist/lib/browser/meta.mjs +0 -11
  563. package/dist/lib/browser/meta.mjs.map +0 -7
  564. package/dist/types/src/GithubPlugin.d.ts +0 -4
  565. package/dist/types/src/GithubPlugin.d.ts.map +0 -1
  566. package/dist/types/src/components/EmbeddedMain/EmbeddedMain.d.ts +0 -4
  567. package/dist/types/src/components/EmbeddedMain/EmbeddedMain.d.ts.map +0 -1
  568. package/dist/types/src/components/EmbeddedMain/GfmPreview.d.ts +0 -9
  569. package/dist/types/src/components/EmbeddedMain/GfmPreview.d.ts.map +0 -1
  570. package/dist/types/src/components/EmbeddedMain/index.d.ts +0 -2
  571. package/dist/types/src/components/EmbeddedMain/index.d.ts.map +0 -1
  572. package/dist/types/src/components/ExportDialog.d.ts +0 -8
  573. package/dist/types/src/components/ExportDialog.d.ts.map +0 -1
  574. package/dist/types/src/components/GithubApiProviders/GitHubSettings.d.ts +0 -3
  575. package/dist/types/src/components/GithubApiProviders/GitHubSettings.d.ts.map +0 -1
  576. package/dist/types/src/components/GithubApiProviders/OctokitProvider.d.ts +0 -15
  577. package/dist/types/src/components/GithubApiProviders/OctokitProvider.d.ts.map +0 -1
  578. package/dist/types/src/components/GithubApiProviders/index.d.ts +0 -3
  579. package/dist/types/src/components/GithubApiProviders/index.d.ts.map +0 -1
  580. package/dist/types/src/components/GithubEchoResolverProviders/DocumentTreeItem.d.ts +0 -6
  581. package/dist/types/src/components/GithubEchoResolverProviders/DocumentTreeItem.d.ts.map +0 -1
  582. package/dist/types/src/components/GithubEchoResolverProviders/ResolverContext.d.ts +0 -7
  583. package/dist/types/src/components/GithubEchoResolverProviders/ResolverContext.d.ts.map +0 -1
  584. package/dist/types/src/components/GithubEchoResolverProviders/ResolverDialog.d.ts +0 -6
  585. package/dist/types/src/components/GithubEchoResolverProviders/ResolverDialog.d.ts.map +0 -1
  586. package/dist/types/src/components/GithubEchoResolverProviders/ResolverProps.d.ts +0 -16
  587. package/dist/types/src/components/GithubEchoResolverProviders/ResolverProps.d.ts.map +0 -1
  588. package/dist/types/src/components/GithubEchoResolverProviders/ResolverTree.d.ts +0 -3
  589. package/dist/types/src/components/GithubEchoResolverProviders/ResolverTree.d.ts.map +0 -1
  590. package/dist/types/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.d.ts +0 -11
  591. package/dist/types/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.d.ts.map +0 -1
  592. package/dist/types/src/components/GithubEchoResolverProviders/index.d.ts +0 -3
  593. package/dist/types/src/components/GithubEchoResolverProviders/index.d.ts.map +0 -1
  594. package/dist/types/src/components/GithubEchoResolverProviders/spaceResolvers.d.ts +0 -6
  595. package/dist/types/src/components/GithubEchoResolverProviders/spaceResolvers.d.ts.map +0 -1
  596. package/dist/types/src/components/ImportDialog.d.ts +0 -7
  597. package/dist/types/src/components/ImportDialog.d.ts.map +0 -1
  598. package/dist/types/src/components/Issue.d.ts +0 -5
  599. package/dist/types/src/components/Issue.d.ts.map +0 -1
  600. package/dist/types/src/components/Loading/Loading.d.ts +0 -15
  601. package/dist/types/src/components/Loading/Loading.d.ts.map +0 -1
  602. package/dist/types/src/components/Loading/Loading.stories.d.ts +0 -40
  603. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +0 -1
  604. package/dist/types/src/components/Loading/index.d.ts +0 -2
  605. package/dist/types/src/components/Loading/index.d.ts.map +0 -1
  606. package/dist/types/src/components/MarkdownActions.d.ts +0 -7
  607. package/dist/types/src/components/MarkdownActions.d.ts.map +0 -1
  608. package/dist/types/src/components/UrlDialog.d.ts +0 -6
  609. package/dist/types/src/components/UrlDialog.d.ts.map +0 -1
  610. package/dist/types/src/hooks/useDocGhId.d.ts +0 -6
  611. package/dist/types/src/hooks/useDocGhId.d.ts.map +0 -1
  612. package/dist/types/src/hooks/useGhIdFromUrl.d.ts +0 -2
  613. package/dist/types/src/hooks/useGhIdFromUrl.d.ts.map +0 -1
  614. package/dist/types/src/types.d.ts +0 -30
  615. package/dist/types/src/types.d.ts.map +0 -1
  616. package/src/GithubPlugin.tsx +0 -127
  617. package/src/components/EmbeddedMain/EmbeddedMain.tsx +0 -294
  618. package/src/components/EmbeddedMain/GfmPreview.tsx +0 -110
  619. package/src/components/EmbeddedMain/embedded.css +0 -3
  620. package/src/components/EmbeddedMain/index.ts +0 -5
  621. package/src/components/ExportDialog.tsx +0 -157
  622. package/src/components/GithubApiProviders/GitHubSettings.tsx +0 -72
  623. package/src/components/GithubApiProviders/OctokitProvider.tsx +0 -60
  624. package/src/components/GithubApiProviders/index.ts +0 -6
  625. package/src/components/GithubEchoResolverProviders/DocumentTreeItem.tsx +0 -26
  626. package/src/components/GithubEchoResolverProviders/ResolverContext.tsx +0 -137
  627. package/src/components/GithubEchoResolverProviders/ResolverDialog.tsx +0 -34
  628. package/src/components/GithubEchoResolverProviders/ResolverProps.ts +0 -23
  629. package/src/components/GithubEchoResolverProviders/ResolverTree.tsx +0 -86
  630. package/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.tsx +0 -105
  631. package/src/components/GithubEchoResolverProviders/index.ts +0 -6
  632. package/src/components/GithubEchoResolverProviders/spaceResolvers.ts +0 -86
  633. package/src/components/ImportDialog.tsx +0 -72
  634. package/src/components/Issue.tsx +0 -62
  635. package/src/components/Loading/Loading.stories.tsx +0 -32
  636. package/src/components/Loading/Loading.tsx +0 -70
  637. package/src/components/Loading/index.ts +0 -5
  638. package/src/components/MarkdownActions.tsx +0 -136
  639. package/src/components/UrlDialog.tsx +0 -52
  640. package/src/hooks/useDocGhId.ts +0 -38
  641. package/src/hooks/useGhIdFromUrl.ts +0 -26
  642. package/src/types.ts +0 -51
@@ -0,0 +1,735 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // TODO(wittjosiah): Refactor to use a dfx-style Effect-native client.
6
+
7
+ import * as Cause from 'effect/Cause';
8
+ import * as Context from 'effect/Context';
9
+ import * as Effect from 'effect/Effect';
10
+ import * as HttpClient from 'effect/http/HttpClient';
11
+ import * as HttpClientError from 'effect/http/HttpClientError';
12
+ import * as HttpClientRequest from 'effect/http/HttpClientRequest';
13
+ import * as Layer from 'effect/Layer';
14
+ import * as Schedule from 'effect/Schedule';
15
+ import * as Schema from 'effect/Schema';
16
+
17
+ import { Database, type Ref } from '@dxos/echo';
18
+ import { type AccessToken, Connection } from '@dxos/link';
19
+
20
+ import { GITHUB_API_BASE } from '../constants.ts';
21
+
22
+ /** Stored as `AccessToken.token`; sent as `Authorization: Bearer <token>`. Empty means anonymous. */
23
+ type GitHubCredentialsValue = {
24
+ token: string;
25
+ };
26
+
27
+ const ACCEPT = 'application/vnd.github+json';
28
+ /** Serves a pull request as the unified diff git would produce, rather than as JSON. */
29
+ const DIFF_ACCEPT = 'application/vnd.github.v3.diff';
30
+ const API_VERSION = '2022-11-28';
31
+ const USER_AGENT = '@dxos/plugin-github';
32
+
33
+ //
34
+ // Subset schemas for the responses we care about
35
+ //
36
+
37
+ const GitHubUserSchema = Schema.Struct({
38
+ id: Schema.Number,
39
+ login: Schema.String,
40
+ name: Schema.NullOr(Schema.String).pipe(Schema.optional),
41
+ email: Schema.NullOr(Schema.String).pipe(Schema.optional),
42
+ avatar_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
43
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
44
+ bio: Schema.NullOr(Schema.String).pipe(Schema.optional),
45
+ company: Schema.NullOr(Schema.String).pipe(Schema.optional),
46
+ type: Schema.NullOr(Schema.String).pipe(Schema.optional),
47
+ });
48
+ export type GitHubUser = Schema.Schema.Type<typeof GitHubUserSchema>;
49
+
50
+ const GitHubOrgSchema = Schema.Struct({
51
+ id: Schema.Number,
52
+ login: Schema.String,
53
+ description: Schema.NullOr(Schema.String).pipe(Schema.optional),
54
+ name: Schema.NullOr(Schema.String).pipe(Schema.optional),
55
+ blog: Schema.NullOr(Schema.String).pipe(Schema.optional),
56
+ avatar_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
57
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
58
+ location: Schema.NullOr(Schema.String).pipe(Schema.optional),
59
+ });
60
+ export type GitHubOrg = Schema.Schema.Type<typeof GitHubOrgSchema>;
61
+
62
+ const GitHubRepoSchema = Schema.Struct({
63
+ id: Schema.Number,
64
+ name: Schema.String,
65
+ full_name: Schema.String,
66
+ description: Schema.NullOr(Schema.String).pipe(Schema.optional),
67
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
68
+ homepage: Schema.NullOr(Schema.String).pipe(Schema.optional),
69
+ archived: Schema.Boolean.pipe(Schema.optional),
70
+ disabled: Schema.Boolean.pipe(Schema.optional),
71
+ fork: Schema.Boolean.pipe(Schema.optional),
72
+ default_branch: Schema.NullOr(Schema.String).pipe(Schema.optional),
73
+ owner: Schema.Struct({ id: Schema.Number, login: Schema.String }),
74
+ });
75
+ export type GitHubRepo = Schema.Schema.Type<typeof GitHubRepoSchema>;
76
+
77
+ const GitHubLabelSchema = Schema.Struct({
78
+ name: Schema.String,
79
+ });
80
+
81
+ const GitHubPullRefSchema = Schema.Struct({
82
+ url: Schema.String,
83
+ merged_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
84
+ });
85
+
86
+ const GitHubMilestoneSchema = Schema.Struct({
87
+ id: Schema.Number,
88
+ number: Schema.Number,
89
+ title: Schema.String,
90
+ description: Schema.NullOr(Schema.String).pipe(Schema.optional),
91
+ state: Schema.NullOr(Schema.String).pipe(Schema.optional),
92
+ /** ISO datetime, unlike the date-only shape the local model stores. */
93
+ due_on: Schema.NullOr(Schema.String).pipe(Schema.optional),
94
+ });
95
+ export type GitHubMilestone = Schema.Schema.Type<typeof GitHubMilestoneSchema>;
96
+
97
+ const GitHubIssueSchema = Schema.Struct({
98
+ id: Schema.Number,
99
+ number: Schema.Number,
100
+ title: Schema.String,
101
+ body: Schema.NullOr(Schema.String).pipe(Schema.optional),
102
+ state: Schema.String,
103
+ state_reason: Schema.NullOr(Schema.String).pipe(Schema.optional),
104
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
105
+ comments: Schema.Number.pipe(Schema.optional),
106
+ comments_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
107
+ created_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
108
+ updated_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
109
+ closed_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
110
+ user: Schema.NullOr(GitHubUserSchema).pipe(Schema.optional),
111
+ assignees: Schema.Array(GitHubUserSchema).pipe(Schema.optional),
112
+ labels: Schema.Array(GitHubLabelSchema).pipe(Schema.optional),
113
+ milestone: Schema.NullOr(GitHubMilestoneSchema).pipe(Schema.optional),
114
+ pull_request: Schema.NullOr(GitHubPullRefSchema).pipe(Schema.optional),
115
+ });
116
+ export type GitHubIssue = Schema.Schema.Type<typeof GitHubIssueSchema>;
117
+
118
+ /** GET /repos/{owner}/{repo}/pulls/{number} — the pull-request view, which alone carries the diff size and merge state. */
119
+ const GitHubPullSchema = Schema.Struct({
120
+ id: Schema.Number,
121
+ number: Schema.Number,
122
+ title: Schema.String,
123
+ body: Schema.NullOr(Schema.String).pipe(Schema.optional),
124
+ state: Schema.String,
125
+ draft: Schema.Boolean.pipe(Schema.optional),
126
+ merged: Schema.Boolean.pipe(Schema.optional),
127
+ merged_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
128
+ created_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
129
+ updated_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
130
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
131
+ user: Schema.NullOr(GitHubUserSchema).pipe(Schema.optional),
132
+ labels: Schema.Array(GitHubLabelSchema).pipe(Schema.optional),
133
+ additions: Schema.Number.pipe(Schema.optional),
134
+ deletions: Schema.Number.pipe(Schema.optional),
135
+ // `sha` pins the commit a derived artefact (a generated walkthrough) describes; `ref` is a branch
136
+ // name and moves under it.
137
+ base: Schema.Struct({ ref: Schema.String, sha: Schema.String.pipe(Schema.optional) }).pipe(Schema.optional),
138
+ head: Schema.Struct({ ref: Schema.String, sha: Schema.String.pipe(Schema.optional) }).pipe(Schema.optional),
139
+ });
140
+ export type GitHubPull = Schema.Schema.Type<typeof GitHubPullSchema>;
141
+
142
+ const GitHubCommentSchema = Schema.Struct({
143
+ id: Schema.Number,
144
+ body: Schema.NullOr(Schema.String).pipe(Schema.optional),
145
+ user: Schema.NullOr(GitHubUserSchema).pipe(Schema.optional),
146
+ created_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
147
+ updated_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
148
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
149
+ });
150
+ export type GitHubComment = Schema.Schema.Type<typeof GitHubCommentSchema>;
151
+
152
+ //
153
+ // Credentials service
154
+ //
155
+
156
+ /**
157
+ * Layer-based credentials service. Mirrors `TrelloCredentials`: every API call
158
+ * pulls the token from this service rather than threading it through as an
159
+ * explicit parameter, so callers compose a single
160
+ * `Effect.provide(GitHubApi.fromConnection(ref))` at the
161
+ * operation boundary.
162
+ *
163
+ * Token sourcing: an operation invoked with a `Connection` composes
164
+ * `fromConnection(ref)`; one invoked with an external-sync cursor composes
165
+ * `fromAccessToken(cursor.spec.source)` directly (the cursor no longer relates
166
+ * to `Connection`).
167
+ */
168
+ export class GitHubCredentials extends Context.Service<GitHubCredentials, GitHubCredentialsValue>()(
169
+ '@dxos/plugin-github/GitHubCredentials',
170
+ ) {}
171
+
172
+ /** Creates a credentials layer from an AccessToken ref. Loads it and returns its `token`. */
173
+ export const fromAccessToken = (accessTokenRef: Ref.Ref<AccessToken.AccessToken>) =>
174
+ Layer.effect(
175
+ GitHubCredentials,
176
+ Effect.gen(function* () {
177
+ const accessToken = yield* Database.load(accessTokenRef);
178
+ return { token: accessToken.token };
179
+ }),
180
+ );
181
+
182
+ /** Creates a credentials layer from a Connection ref. Loads its `accessToken` and returns its `token`. */
183
+ export const fromConnection = (connectionRef: Ref.Ref<Connection.Connection>) =>
184
+ Layer.effect(
185
+ GitHubCredentials,
186
+ Effect.gen(function* () {
187
+ const connection = yield* Database.load(connectionRef);
188
+ const accessToken = yield* Database.load(connection.accessToken);
189
+ return { token: accessToken.token };
190
+ }),
191
+ );
192
+
193
+ //
194
+ // Request pipeline
195
+ //
196
+
197
+ export type GitHubEffect<T> = Effect.Effect<
198
+ T,
199
+ HttpClientError.HttpClientError | Schema.SchemaError | Cause.TimeoutError,
200
+ HttpClient.HttpClient | GitHubCredentials
201
+ >;
202
+
203
+ /**
204
+ * Decide whether a GitHub request failure is worth retrying.
205
+ * - Transport / encode failures: yes (transient by nature).
206
+ * - 429 / 5xx: yes — exactly the cases retry was designed for.
207
+ * - 4xx other than 429 (auth, validation, not-found): no — wastes time and
208
+ * may exacerbate rate limiting on the same token.
209
+ * - TimeoutException: yes.
210
+ * - Schema decode failures (`ParseError`): no — payload won't become valid on retry.
211
+ */
212
+ const shouldRetry = (error: HttpClientError.HttpClientError | Schema.SchemaError | Cause.TimeoutError): boolean => {
213
+ if (error instanceof Schema.SchemaError) {
214
+ return false;
215
+ }
216
+ if (Cause.isTimeoutError(error)) {
217
+ return true;
218
+ }
219
+ // v4 hangs the specific failure off `HttpClientError.reason`: a transport-level failure is always
220
+ // worth retrying, and a response failure only on 429/5xx.
221
+ if (error.reason._tag !== 'StatusCodeError') {
222
+ return true;
223
+ }
224
+ const status = error.reason.response.status;
225
+ return status === 429 || (status >= 500 && status <= 599);
226
+ };
227
+
228
+ /**
229
+ * The status a failed GitHub request answered with, or `undefined` for a transport, timeout or
230
+ * decode failure. Callers branch on it to tell a dead credential (401) from an absent resource.
231
+ */
232
+ export const responseStatus = (error: unknown): number | undefined =>
233
+ HttpClientError.isHttpClientError(error) && error.reason._tag === 'StatusCodeError'
234
+ ? error.reason.response.status
235
+ : undefined;
236
+
237
+ /** Anonymous when the token is empty: a bare `Bearer` header is rejected where no header is rate-limited. */
238
+ const withAuth = (req: HttpClientRequest.HttpClientRequest, creds: GitHubCredentialsValue, accept = ACCEPT) =>
239
+ req.pipe(
240
+ (req) => (creds.token ? HttpClientRequest.setHeader(req, 'Authorization', `Bearer ${creds.token}`) : req),
241
+ HttpClientRequest.setHeader('Accept', accept),
242
+ HttpClientRequest.setHeader('X-GitHub-Api-Version', API_VERSION),
243
+ HttpClientRequest.setHeader('User-Agent', USER_AGENT),
244
+ );
245
+
246
+ /**
247
+ * Build an unauthenticated GitHub API request, fetch + decode it as a single JSON
248
+ * response, and apply timeout + retry. `withAuth` is applied here so callers never
249
+ * have to remember to attach credentials (forgetting would silently 401).
250
+ *
251
+ * `filterStatusOk` converts non-2xx responses into a typed `ResponseError`
252
+ * (carrying `status` and the raw body) BEFORE we try to decode the body —
253
+ * otherwise GitHub error envelopes (`{ message, documentation_url }`) would
254
+ * blow up against the success schema with a `ParseError`, masking the real
255
+ * cause (e.g. a 403 from an integration token that lacks issue write).
256
+ */
257
+ const githubRequest = <T>(build: () => HttpClientRequest.HttpClientRequest, schema: Schema.Codec<T>): GitHubEffect<T> =>
258
+ Effect.gen(function* () {
259
+ const creds = yield* GitHubCredentials;
260
+ const httpClient = yield* HttpClient.HttpClient;
261
+ const clientNoTracer = httpClient.pipe(
262
+ HttpClient.transformResponse(Effect.provideService(HttpClient.TracerDisabledWhen, () => true)),
263
+ HttpClient.filterStatusOk,
264
+ );
265
+ return yield* clientNoTracer.execute(withAuth(build(), creds)).pipe(
266
+ Effect.flatMap((res) => Effect.flatMap(res.json, Schema.decodeUnknownEffect(schema))),
267
+ Effect.timeout('15 seconds'),
268
+ Effect.retry({
269
+ schedule: Schedule.exponential('500 millis').pipe(Schedule.jittered, Schedule.upTo({ times: 3 })),
270
+ while: shouldRetry,
271
+ }),
272
+ Effect.scoped,
273
+ );
274
+ });
275
+
276
+ /**
277
+ * Fetch a response GitHub serves as text rather than JSON — the `diff` media type, which has no
278
+ * schema to decode against.
279
+ *
280
+ * The timeout is longer than `githubRequest`'s because a diff is the whole change rather than a
281
+ * summary of it. GitHub answers 406 rather than truncating when a pull request exceeds its own
282
+ * limits (roughly 300 files or 20k lines), which `filterStatusOk` surfaces as a typed failure.
283
+ */
284
+ const githubText = (build: () => HttpClientRequest.HttpClientRequest, accept: string): GitHubEffect<string> =>
285
+ Effect.gen(function* () {
286
+ const creds = yield* GitHubCredentials;
287
+ const httpClient = yield* HttpClient.HttpClient;
288
+ const clientNoTracer = httpClient.pipe(
289
+ HttpClient.transformResponse(Effect.provideService(HttpClient.TracerDisabledWhen, () => true)),
290
+ HttpClient.filterStatusOk,
291
+ );
292
+ return yield* clientNoTracer.execute(withAuth(build(), creds, accept)).pipe(
293
+ Effect.flatMap((res) => res.text),
294
+ Effect.timeout('60 seconds'),
295
+ Effect.retry({
296
+ schedule: Schedule.exponential('500 millis').pipe(Schedule.jittered, Schedule.upTo({ times: 3 })),
297
+ while: shouldRetry,
298
+ }),
299
+ Effect.scoped,
300
+ );
301
+ });
302
+
303
+ //
304
+ // Pagination
305
+ //
306
+
307
+ /**
308
+ * Walk paginated GitHub list endpoints by following `Link: <…>; rel="next"`.
309
+ *
310
+ * Sets `per_page=100` automatically; aggregates pages into a single array.
311
+ * Returns the empty array if the first page is empty. Stops at `MAX_PAGES`
312
+ * to bound memory + traffic for very large orgs/repos — in v1 we accept that
313
+ * the very largest orgs may be partially synced and surface a TODO to add
314
+ * cursor support.
315
+ */
316
+ const MAX_PAGES = 10;
317
+
318
+ const getNextLink = (header: string | undefined): string | undefined => {
319
+ if (!header) {
320
+ return undefined;
321
+ }
322
+ // Link: <url>; rel="next", <url>; rel="last", …
323
+ for (const part of header.split(',')) {
324
+ const match = part.trim().match(/^<([^>]+)>;\s*rel="([^"]+)"$/);
325
+ if (match && match[2] === 'next') {
326
+ return match[1];
327
+ }
328
+ }
329
+ return undefined;
330
+ };
331
+
332
+ /**
333
+ * Walks `rel="next"` to the end, decoding each page with `pageSchema` and taking its items through
334
+ * `select` — an endpoint that answers with an envelope rather than a bare array pages the same way.
335
+ */
336
+ const githubPages = <TPage, T>(
337
+ buildInitial: () => HttpClientRequest.HttpClientRequest,
338
+ pageSchema: Schema.Codec<TPage>,
339
+ select: (page: TPage) => readonly T[],
340
+ ): GitHubEffect<readonly T[]> =>
341
+ Effect.gen(function* () {
342
+ const httpClient = yield* HttpClient.HttpClient;
343
+ const creds = yield* GitHubCredentials;
344
+ const clientNoTracer = httpClient.pipe(
345
+ HttpClient.transformResponse(Effect.provideService(HttpClient.TracerDisabledWhen, () => true)),
346
+ HttpClient.filterStatusOk,
347
+ );
348
+
349
+ let nextUrl: string | undefined;
350
+ let request = withAuth(buildInitial(), creds).pipe(HttpClientRequest.appendUrlParam('per_page', '100'));
351
+ const out: T[] = [];
352
+
353
+ for (let page = 0; page < MAX_PAGES; page++) {
354
+ const result = yield* clientNoTracer.execute(request).pipe(
355
+ Effect.flatMap((res) =>
356
+ Effect.gen(function* () {
357
+ const body = yield* res.json;
358
+ const decoded = yield* Schema.decodeUnknownEffect(pageSchema)(body);
359
+ return { decoded, link: res.headers['link'] };
360
+ }),
361
+ ),
362
+ Effect.timeout('15 seconds'),
363
+ Effect.retry({
364
+ schedule: Schedule.exponential('500 millis').pipe(Schedule.jittered, Schedule.upTo({ times: 3 })),
365
+ while: shouldRetry,
366
+ }),
367
+ Effect.scoped,
368
+ );
369
+
370
+ out.push(...select(result.decoded));
371
+ nextUrl = getNextLink(result.link);
372
+ if (!nextUrl) {
373
+ break;
374
+ }
375
+ request = withAuth(HttpClientRequest.get(nextUrl), creds);
376
+ }
377
+
378
+ return out;
379
+ });
380
+
381
+ const githubPaginated = <T>(
382
+ buildInitial: () => HttpClientRequest.HttpClientRequest,
383
+ itemSchema: Schema.Codec<T>,
384
+ ): GitHubEffect<readonly T[]> => githubPages(buildInitial, Schema.Array(itemSchema), (page) => page);
385
+
386
+ //
387
+ // API surface
388
+ //
389
+
390
+ /** GET /user — authenticated user profile. */
391
+ export const fetchUser = (): GitHubEffect<GitHubUser> =>
392
+ githubRequest(() => HttpClientRequest.get(`${GITHUB_API_BASE}/user`), GitHubUserSchema);
393
+
394
+ /** GET /user/orgs — orgs visible to the authenticated user. */
395
+ export const fetchUserOrgs = (): GitHubEffect<readonly GitHubOrg[]> =>
396
+ githubPaginated(() => HttpClientRequest.get(`${GITHUB_API_BASE}/user/orgs`), GitHubOrgSchema);
397
+
398
+ /**
399
+ * GET /user/repos — every repo the authenticated user can see.
400
+ *
401
+ * Includes owner, collaborator, and org-member affiliations. For a GitHub App
402
+ * user-to-server token this is intersected with the App's installation scope —
403
+ * admins control which repos are visible by choosing All / Selected at install
404
+ * time.
405
+ */
406
+ export const fetchUserRepos = (): GitHubEffect<readonly GitHubRepo[]> =>
407
+ githubPaginated(() => HttpClientRequest.get(`${GITHUB_API_BASE}/user/repos`), GitHubRepoSchema);
408
+
409
+ /** GET /orgs/{org} — full org metadata. */
410
+ export const fetchOrg = (org: string): GitHubEffect<GitHubOrg> =>
411
+ githubRequest(() => HttpClientRequest.get(`${GITHUB_API_BASE}/orgs/${encodeURIComponent(org)}`), GitHubOrgSchema);
412
+
413
+ /** GET /orgs/{org}/members — public + private members (depends on token). */
414
+ export const fetchOrgMembers = (org: string): GitHubEffect<readonly GitHubUser[]> =>
415
+ githubPaginated(
416
+ () => HttpClientRequest.get(`${GITHUB_API_BASE}/orgs/${encodeURIComponent(org)}/members`),
417
+ GitHubUserSchema,
418
+ );
419
+
420
+ /** GET /users/{login} — full user profile (org members lists return a partial form). */
421
+ export const fetchUserByLogin = (login: string): GitHubEffect<GitHubUser> =>
422
+ githubRequest(() => HttpClientRequest.get(`${GITHUB_API_BASE}/users/${encodeURIComponent(login)}`), GitHubUserSchema);
423
+
424
+ /** GET /orgs/{org}/repos — repos owned by the org. */
425
+ export const fetchOrgRepos = (org: string): GitHubEffect<readonly GitHubRepo[]> =>
426
+ githubPaginated(
427
+ () => HttpClientRequest.get(`${GITHUB_API_BASE}/orgs/${encodeURIComponent(org)}/repos`),
428
+ GitHubRepoSchema,
429
+ );
430
+
431
+ /**
432
+ * GET /repos/{owner}/{repo}/issues — both issues AND pull requests.
433
+ *
434
+ * `state=all` includes closed. PRs are distinguishable by a non-null
435
+ * `pull_request` field. `since` is an optional ISO timestamp; when provided,
436
+ * GitHub returns only issues updated at or after that point — we use this
437
+ * for incremental syncs.
438
+ */
439
+ export const fetchRepoIssues = (
440
+ owner: string,
441
+ repo: string,
442
+ options: { since?: string } = {},
443
+ ): GitHubEffect<readonly GitHubIssue[]> =>
444
+ githubPaginated(() => {
445
+ let req = HttpClientRequest.get(
446
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues`,
447
+ ).pipe(HttpClientRequest.appendUrlParam('state', 'all'));
448
+ if (options.since) {
449
+ req = req.pipe(HttpClientRequest.appendUrlParam('since', options.since));
450
+ }
451
+ return req;
452
+ }, GitHubIssueSchema);
453
+
454
+ /** GET /repos/{owner}/{repo}. */
455
+ export const fetchRepo = (owner: string, repo: string): GitHubEffect<GitHubRepo> =>
456
+ githubRequest(
457
+ () => HttpClientRequest.get(`${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`),
458
+ GitHubRepoSchema,
459
+ );
460
+
461
+ /** GET /repos/{owner}/{repo}/issues/{number} — an issue, or the issue view of a pull request. */
462
+ export const fetchIssue = (owner: string, repo: string, number: number): GitHubEffect<GitHubIssue> =>
463
+ githubRequest(
464
+ () =>
465
+ HttpClientRequest.get(
466
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${number}`,
467
+ ),
468
+ GitHubIssueSchema,
469
+ );
470
+
471
+ /** GET /repos/{owner}/{repo}/pulls/{number}. */
472
+ export const fetchPullRequest = (owner: string, repo: string, number: number): GitHubEffect<GitHubPull> =>
473
+ githubRequest(
474
+ () =>
475
+ HttpClientRequest.get(
476
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}`,
477
+ ),
478
+ GitHubPullSchema,
479
+ );
480
+
481
+ /**
482
+ * GET /repos/{owner}/{repo}/pulls/{number} as a unified diff — the same bytes `git diff` would
483
+ * produce, which is what a generated walkthrough splices its chunks from.
484
+ */
485
+ export const fetchPullRequestDiff = (owner: string, repo: string, number: number): GitHubEffect<string> =>
486
+ githubText(
487
+ () =>
488
+ HttpClientRequest.get(
489
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}`,
490
+ ),
491
+ DIFF_ACCEPT,
492
+ );
493
+
494
+ /**
495
+ * GET /repos/{owner}/{repo}/milestones — `state=all` so closed milestones stay mirrored (the
496
+ * issues still assigned to them have to resolve to something).
497
+ */
498
+ export const fetchRepoMilestones = (owner: string, repo: string): GitHubEffect<readonly GitHubMilestone[]> =>
499
+ githubPaginated(
500
+ () =>
501
+ HttpClientRequest.get(
502
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/milestones`,
503
+ ).pipe(HttpClientRequest.appendUrlParam('state', 'all')),
504
+ GitHubMilestoneSchema,
505
+ );
506
+
507
+ /** GET /repos/{owner}/{repo}/issues/{number}/comments. */
508
+ export const fetchIssueComments = (
509
+ owner: string,
510
+ repo: string,
511
+ issueNumber: number,
512
+ ): GitHubEffect<readonly GitHubComment[]> =>
513
+ githubPaginated(
514
+ () =>
515
+ HttpClientRequest.get(
516
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${issueNumber}/comments`,
517
+ ),
518
+ GitHubCommentSchema,
519
+ );
520
+
521
+ //
522
+ // Mutations (push)
523
+ //
524
+
525
+ /**
526
+ * Write to a GitHub object (PATCH or POST, as `build` chooses). The shape mirrors {@link githubRequest} except the
527
+ * body is `application/json`. Failures are
528
+ * propagated unchanged; the caller is expected to surface them on the target
529
+ * row's `lastError`.
530
+ *
531
+ * Only PATCH retries (429 / 5xx retry, 4xx don't). A POST here creates a comment or a review, and
532
+ * GitHub can commit one before the response reaches us, so retrying a timeout would post it twice.
533
+ */
534
+ const githubWrite = <T>(
535
+ build: () => HttpClientRequest.HttpClientRequest,
536
+ body: Record<string, unknown>,
537
+ schema: Schema.Codec<T>,
538
+ ): GitHubEffect<T> =>
539
+ Effect.gen(function* () {
540
+ const creds = yield* GitHubCredentials;
541
+ const httpClient = yield* HttpClient.HttpClient;
542
+ const clientNoTracer = httpClient.pipe(
543
+ HttpClient.transformResponse(Effect.provideService(HttpClient.TracerDisabledWhen, () => true)),
544
+ HttpClient.filterStatusOk,
545
+ );
546
+ const request = withAuth(build(), creds).pipe(HttpClientRequest.bodyJsonUnsafe(body));
547
+ const attempt = clientNoTracer.execute(request).pipe(
548
+ Effect.flatMap((res) => Effect.flatMap(res.json, Schema.decodeUnknownEffect(schema))),
549
+ Effect.timeout('15 seconds'),
550
+ );
551
+ return yield* (
552
+ request.method === 'PATCH'
553
+ ? attempt.pipe(
554
+ Effect.retry({
555
+ schedule: Schedule.exponential('500 millis').pipe(Schedule.jittered, Schedule.upTo({ times: 3 })),
556
+ while: shouldRetry,
557
+ }),
558
+ )
559
+ : attempt
560
+ ).pipe(Effect.scoped);
561
+ });
562
+
563
+ export type IssueUpdateInput = {
564
+ title?: string;
565
+ body?: string;
566
+ state?: 'open' | 'closed';
567
+ state_reason?: 'completed' | 'not_planned' | 'reopened' | null;
568
+ };
569
+
570
+ /**
571
+ * PATCH /repos/{owner}/{repo}/issues/{number} — update title / body / state.
572
+ *
573
+ * GitHub conflates issues and PRs at this endpoint: the same PATCH works for
574
+ * both, but PR-specific fields (head/base/draft) must go through the
575
+ * `/pulls/{n}` endpoint. We only touch issue-mappable fields here.
576
+ */
577
+ export const updateIssue = (
578
+ owner: string,
579
+ repo: string,
580
+ issueNumber: number,
581
+ input: IssueUpdateInput,
582
+ ): GitHubEffect<GitHubIssue> =>
583
+ githubWrite(
584
+ () =>
585
+ HttpClientRequest.patch(
586
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${issueNumber}`,
587
+ ),
588
+ input as unknown as Record<string, unknown>,
589
+ GitHubIssueSchema,
590
+ );
591
+
592
+ export type RepoUpdateInput = {
593
+ /** GitHub allows the owner of a repo to rename it; this is rare and risky and we currently don't push it. */
594
+ name?: string;
595
+ description?: string;
596
+ homepage?: string;
597
+ };
598
+
599
+ /**
600
+ * PATCH /repos/{owner}/{repo} — update repo description and a small set of
601
+ * mapped metadata. Renames (`name`) are accepted by the API but we don't push
602
+ * them by default: a rename invalidates clones, breaks pinned URLs, and is
603
+ * almost never what a user wants from a sync mirror.
604
+ */
605
+ export const updateRepo = (owner: string, repo: string, input: RepoUpdateInput): GitHubEffect<GitHubRepo> =>
606
+ githubWrite(
607
+ () => HttpClientRequest.patch(`${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`),
608
+ input as unknown as Record<string, unknown>,
609
+ GitHubRepoSchema,
610
+ );
611
+
612
+ const GitHubReviewSchema = Schema.Struct({
613
+ id: Schema.Number,
614
+ state: Schema.String,
615
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
616
+ });
617
+ export type GitHubReview = Schema.Schema.Type<typeof GitHubReviewSchema>;
618
+
619
+ /** POST /repos/{owner}/{repo}/pulls/{number}/reviews with `event: APPROVE`. */
620
+ export const approvePullRequest = (
621
+ owner: string,
622
+ repo: string,
623
+ number: number,
624
+ body?: string,
625
+ ): GitHubEffect<GitHubReview> =>
626
+ githubWrite(
627
+ () =>
628
+ HttpClientRequest.post(
629
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}/reviews`,
630
+ ),
631
+ { event: 'APPROVE', ...(body ? { body } : {}) },
632
+ GitHubReviewSchema,
633
+ );
634
+
635
+ const GitHubSubmittedReviewSchema = Schema.Struct({
636
+ id: Schema.Number,
637
+ /** `APPROVED`, `CHANGES_REQUESTED`, `COMMENTED`, `DISMISSED` or `PENDING`. */
638
+ state: Schema.String,
639
+ user: Schema.NullOr(Schema.Struct({ login: Schema.String })).pipe(Schema.optional),
640
+ submitted_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
641
+ });
642
+ export type GitHubSubmittedReview = Schema.Schema.Type<typeof GitHubSubmittedReviewSchema>;
643
+
644
+ /**
645
+ * GET /repos/{owner}/{repo}/pulls/{number}/reviews — every page, oldest first, since a reviewer's
646
+ * standing verdict is their latest review and a truncated list could miss it.
647
+ */
648
+ export const fetchReviews = (
649
+ owner: string,
650
+ repo: string,
651
+ number: number,
652
+ ): GitHubEffect<readonly GitHubSubmittedReview[]> =>
653
+ githubPages(
654
+ () =>
655
+ HttpClientRequest.get(
656
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}/reviews`,
657
+ ),
658
+ Schema.Array(GitHubSubmittedReviewSchema),
659
+ (page) => page,
660
+ );
661
+
662
+ /** POST /repos/{owner}/{repo}/issues/{number}/comments — a conversation comment, which a pull request shares with issues. */
663
+ export const createIssueComment = (
664
+ owner: string,
665
+ repo: string,
666
+ issueNumber: number,
667
+ body: string,
668
+ ): GitHubEffect<GitHubComment> =>
669
+ githubWrite(
670
+ () =>
671
+ HttpClientRequest.post(
672
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${issueNumber}/comments`,
673
+ ),
674
+ { body },
675
+ GitHubCommentSchema,
676
+ );
677
+
678
+ const GitHubCheckRunSchema = Schema.Struct({
679
+ name: Schema.String,
680
+ /** `queued`, `in_progress` or `completed`. */
681
+ status: Schema.String,
682
+ /** Set once `completed`: `success`, `failure`, `neutral`, `cancelled`, `skipped`, `timed_out`, `action_required`. */
683
+ conclusion: Schema.NullOr(Schema.String).pipe(Schema.optional),
684
+ html_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
685
+ /** The provider's own page for the run (Depot, say), which GitHub's `html_url` only links back to. */
686
+ details_url: Schema.NullOr(Schema.String).pipe(Schema.optional),
687
+ started_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
688
+ completed_at: Schema.NullOr(Schema.String).pipe(Schema.optional),
689
+ });
690
+ export type GitHubCheckRun = Schema.Schema.Type<typeof GitHubCheckRunSchema>;
691
+
692
+ const GitHubCheckRunsSchema = Schema.Struct({
693
+ total_count: Schema.Number,
694
+ check_runs: Schema.Array(GitHubCheckRunSchema),
695
+ });
696
+
697
+ /**
698
+ * GET /repos/{owner}/{repo}/commits/{sha}/check-runs — every page, since a truncated list would
699
+ * report a failing commit as green.
700
+ */
701
+ export const fetchCheckRuns = (owner: string, repo: string, sha: string): GitHubEffect<readonly GitHubCheckRun[]> =>
702
+ githubPages(
703
+ () =>
704
+ HttpClientRequest.get(
705
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/commits/${encodeURIComponent(sha)}/check-runs`,
706
+ ),
707
+ GitHubCheckRunsSchema,
708
+ ({ check_runs }) => check_runs,
709
+ );
710
+
711
+ export type ReviewCommentInput = {
712
+ body: string;
713
+ /** Head SHA the line numbers refer to. */
714
+ commit_id: string;
715
+ path: string;
716
+ line: number;
717
+ /** `LEFT` is the base (removed) side, `RIGHT` the head (added or context) side. */
718
+ side: 'LEFT' | 'RIGHT';
719
+ };
720
+
721
+ /** POST /repos/{owner}/{repo}/pulls/{number}/comments — a review comment on one line of the diff. */
722
+ export const createReviewComment = (
723
+ owner: string,
724
+ repo: string,
725
+ number: number,
726
+ input: ReviewCommentInput,
727
+ ): GitHubEffect<GitHubComment> =>
728
+ githubWrite(
729
+ () =>
730
+ HttpClientRequest.post(
731
+ `${GITHUB_API_BASE}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}/comments`,
732
+ ),
733
+ input,
734
+ GitHubCommentSchema,
735
+ );