@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,1506 @@
1
+ import { y as responseStatus } from "./chunk-github-api.mjs";
2
+ import { a as renderHunks, i as parsePatch, n as newestWalkthrough, r as spaceHeadings } from "./chunk-generate.mjs";
3
+ import { n as useSyncPullRequest } from "./chunk-react-surface.mjs";
4
+ import { t as githubConnection } from "./chunk-pull-request2.mjs";
5
+ import * as PreviewCapabilities from "@dxos/plugin-preview/PreviewCapabilities";
6
+ import { meta } from "#meta";
7
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
+ import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown, diffBlocks, scrollbarAutohide, walkthroughSidebar, walkthroughTheme } from "@dxos/ui-editor";
9
+ import { GitHubOperation, Walkthrough } from "#types";
10
+ import * as Effect from "effect/Effect";
11
+ import { PullRequest } from "@dxos/types";
12
+ import { Database, Filter, Obj, Ref } from "@dxos/echo";
13
+ import * as Schema from "effect/Schema";
14
+ import * as AppCapabilities from "@dxos/app-toolkit/AppCapabilities";
15
+ import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
16
+ import { log } from "@dxos/log";
17
+ import * as Card from "@dxos/react-ui/Card";
18
+ import * as Hooks from "@dxos/react-ui/Hooks";
19
+ import * as Layout from "@dxos/react-ui/Layout";
20
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
21
+ import { useObject, useQuery } from "@dxos/echo-react";
22
+ import * as Hooks$1 from "@dxos/app-framework/Hooks";
23
+ import * as ToolkitHooks from "@dxos/app-toolkit/Hooks";
24
+ import * as EffectEx from "@dxos/effect/EffectEx";
25
+ import { Form } from "@dxos/react-ui-form";
26
+ import * as Binding from "@dxos/plugin-connector/Binding";
27
+ import { ProgressMeter } from "@dxos/react-ui-components";
28
+ import { ActionToolbar, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
29
+ import * as Panel from "@dxos/react-ui/Panel";
30
+ import * as Tabs from "@dxos/react-ui/Tabs";
31
+ import * as Button from "@dxos/react-ui/Button";
32
+ import * as Field from "@dxos/react-ui/Field";
33
+ import * as Input from "@dxos/react-ui/Input";
34
+ import * as Popover from "@dxos/react-ui/Popover";
35
+ import * as VirtualAnchor from "@dxos/react-ui/VirtualAnchor";
36
+ import { Listbox, Tree, createStaticTreeModel } from "@dxos/react-ui-list";
37
+ import * as ScrollArea from "@dxos/react-ui/ScrollArea";
38
+ import * as Status from "@dxos/react-ui/Status";
39
+ import { TextEditor } from "@dxos/react-ui-editor";
40
+ import { DxAnchor } from "@dxos/lit-ui/react";
41
+ import { MarkdownLink, MarkdownView } from "@dxos/react-ui-markdown";
42
+ import * as Icon from "@dxos/react-ui/Icon";
43
+ import { Masonry } from "@dxos/react-ui-masonry";
44
+ //#region src/components/PullRequestFiles/files.ts
45
+ /** Id of the synthetic root the tree model anchors its top-level rows to; never rendered. */
46
+ var FILE_TREE_ROOT = "root";
47
+ /**
48
+ * The changed files as a directory tree, directories before files and each alphabetical — the order
49
+ * GitHub's own file tree uses. A directory whose only child is another directory is folded into one
50
+ * row (`src/components`), since a chain of single-entry folders is depth without information.
51
+ */
52
+ var buildFileTree = (files) => {
53
+ let count = 0;
54
+ const nextId = () => `node-${++count}`;
55
+ const root = {
56
+ id: FILE_TREE_ROOT,
57
+ path: "",
58
+ name: "",
59
+ children: [],
60
+ added: 0,
61
+ removed: 0
62
+ };
63
+ for (const file of files) {
64
+ const segments = file.path.split("/");
65
+ let parent = root;
66
+ for (let index = 0; index < segments.length - 1; index++) {
67
+ const path = segments.slice(0, index + 1).join("/");
68
+ let directory = parent.children.find((child) => !child.file && child.path === path);
69
+ if (!directory) {
70
+ directory = {
71
+ id: nextId(),
72
+ path,
73
+ name: segments[index],
74
+ children: [],
75
+ added: 0,
76
+ removed: 0
77
+ };
78
+ parent.children.push(directory);
79
+ }
80
+ parent = directory;
81
+ }
82
+ parent.children.push({
83
+ id: nextId(),
84
+ path: file.path,
85
+ name: segments.at(-1) ?? file.path,
86
+ file,
87
+ children: [],
88
+ added: file.added,
89
+ removed: file.removed
90
+ });
91
+ }
92
+ const finish = (node) => {
93
+ const children = node.children.map(finish).sort(compareNodes);
94
+ let folded = {
95
+ ...node,
96
+ children,
97
+ added: node.file ? node.added : children.reduce((sum, child) => sum + child.added, 0),
98
+ removed: node.file ? node.removed : children.reduce((sum, child) => sum + child.removed, 0)
99
+ };
100
+ while (folded !== root && !folded.file && folded.children.length === 1 && !folded.children[0].file) {
101
+ const [only] = folded.children;
102
+ folded = {
103
+ ...only,
104
+ name: `${folded.name}/${only.name}`
105
+ };
106
+ }
107
+ return folded;
108
+ };
109
+ return finish(root);
110
+ };
111
+ var compareNodes = (left, right) => Number(!!left.file) - Number(!!right.file) || left.name.localeCompare(right.name);
112
+ /** The files in the order the tree lists them, which is the order previous/next walks. */
113
+ var flattenFiles = (node) => node.file ? [node.file] : node.children.flatMap(flattenFiles);
114
+ /**
115
+ * One file's change as the ```diff fence the walkthrough renders, so the files view shows a file
116
+ * exactly as a walkthrough chunk would. The fence is one backtick longer than any run in the body:
117
+ * a context line of a markdown file can itself be a fence, which would otherwise close this one.
118
+ */
119
+ var diffFence = (file) => {
120
+ const body = renderHunks(file.hunks);
121
+ const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));
122
+ const fence = "`".repeat(Math.max(3, longest + 1));
123
+ return `${fence}diff file=${file.path}\n${body}\n${fence}`;
124
+ };
125
+ /**
126
+ * A short digest of a file's change. A file is reviewed at a signature: when a push changes the
127
+ * file its signature moves and the check falls away, as GitHub's "Viewed" does.
128
+ */
129
+ var fileSignature = (file) => {
130
+ let hash = 2166136261;
131
+ for (const hunk of file.hunks) for (const line of [hunk.header, ...hunk.lines]) {
132
+ for (let index = 0; index < line.length; index++) {
133
+ hash ^= line.charCodeAt(index);
134
+ hash = Math.imul(hash, 16777619);
135
+ }
136
+ hash ^= 10;
137
+ hash = Math.imul(hash, 16777619);
138
+ }
139
+ return (hash >>> 0).toString(36);
140
+ };
141
+ //#endregion
142
+ //#region src/hooks/usePullRequestFiles.ts
143
+ var __dxlog_file$2 = "/__w/dxos/dxos/packages/plugins/plugin-github/src/hooks/usePullRequestFiles.ts";
144
+ var readRecord = (key) => {
145
+ try {
146
+ const value = localStorage.getItem(key);
147
+ return value ? JSON.parse(value) : {};
148
+ } catch (error) {
149
+ log.warn("reviewed files unreadable", { error }, {
150
+ "~LogMeta": "~LogMeta",
151
+ F: __dxlog_file$2,
152
+ L: 33,
153
+ S: void 0
154
+ });
155
+ return {};
156
+ }
157
+ };
158
+ var writeRecord = (key, record) => {
159
+ try {
160
+ localStorage.setItem(key, JSON.stringify(record));
161
+ } catch (error) {
162
+ log.warn("reviewed files not saved", { error }, {
163
+ "~LogMeta": "~LogMeta",
164
+ F: __dxlog_file$2,
165
+ L: 42,
166
+ S: void 0
167
+ });
168
+ }
169
+ };
170
+ /**
171
+ * A pull request's changed files, the one on screen, and which the reader has reviewed.
172
+ *
173
+ * Reviewed state is the reader's own, so it lives in their browser under `storageKey` rather than in
174
+ * the space. A file is reviewed at the change it had when checked: a push that changes it unchecks
175
+ * it, as GitHub's "Viewed" does.
176
+ */
177
+ var usePullRequestFiles = (diff, storageKey) => {
178
+ const files = useMemo(() => diff === void 0 ? [] : parsePatch(diff), [diff]);
179
+ const tree = useMemo(() => diff === void 0 ? void 0 : buildFileTree(files), [diff, files]);
180
+ const order = useMemo(() => tree ? flattenFiles(tree) : [], [tree]);
181
+ const signatures = useMemo(() => new Map(files.map((file) => [file.path, fileSignature(file)])), [files]);
182
+ const [record, setRecord] = useState(() => readRecord(storageKey));
183
+ useEffect(() => setRecord(readRecord(storageKey)), [storageKey]);
184
+ const reviewed = useMemo(() => new Set(Object.keys(record).filter((path) => signatures.get(path) === record[path])), [record, signatures]);
185
+ const setReviewed = useCallback((path, value) => {
186
+ setRecord((previous) => {
187
+ const next = { ...previous };
188
+ const signature = signatures.get(path);
189
+ if (value && signature) next[path] = signature;
190
+ else delete next[path];
191
+ writeRecord(storageKey, next);
192
+ return next;
193
+ });
194
+ }, [signatures, storageKey]);
195
+ const [selected, setSelected] = useState();
196
+ const file = order.find((candidate) => candidate.path === selected) ?? order[0];
197
+ return {
198
+ tree,
199
+ files,
200
+ file,
201
+ reviewed,
202
+ select: setSelected,
203
+ step: useCallback((delta) => {
204
+ const index = order.findIndex((candidate) => candidate.path === file?.path);
205
+ const next = order[index + delta];
206
+ if (next) setSelected(next.path);
207
+ }, [order, file]),
208
+ setReviewed
209
+ };
210
+ };
211
+ //#endregion
212
+ //#region src/hooks/usePullRequestDiff.ts
213
+ var __dxlog_file$1 = "/__w/dxos/dxos/packages/plugins/plugin-github/src/hooks/usePullRequestDiff.ts";
214
+ /** Reads a pull request's diff through the space's GitHub connection, once `enabled` first turns true. */
215
+ var usePullRequestDiff = (pullRequest, spaceId, enabled) => {
216
+ const { invokePromise } = Hooks$1.useOperationInvoker();
217
+ const [result, setResult] = useState({});
218
+ const [requested, setRequested] = useState(false);
219
+ useEffect(() => {
220
+ if (enabled) setRequested(true);
221
+ }, [enabled]);
222
+ useEffect(() => {
223
+ if (!requested) return;
224
+ let cancelled = false;
225
+ invokePromise(GitHubOperation.GetPullRequestDiff, { pullRequest }, { spaceId }).then(({ data, error }) => {
226
+ if (cancelled) return;
227
+ if (error) log.warn("pull request diff failed", { error }, {
228
+ "~LogMeta": "~LogMeta",
229
+ F: __dxlog_file$1,
230
+ L: 47,
231
+ S: void 0
232
+ });
233
+ setResult({
234
+ diff: data?.diff,
235
+ commit: data?.commit,
236
+ error
237
+ });
238
+ });
239
+ return () => {
240
+ cancelled = true;
241
+ };
242
+ }, [
243
+ requested,
244
+ invokePromise,
245
+ pullRequest,
246
+ spaceId
247
+ ]);
248
+ return result;
249
+ };
250
+ //#endregion
251
+ //#region src/components/CommentComposer/CommentComposer.tsx
252
+ /**
253
+ * The comment field, its target and its buttons — rendered as a band under the pull request header
254
+ * when the comment is about the pull request, and inside {@link LineCommentPopover} when it is
255
+ * about one line of a diff.
256
+ */
257
+ var CommentComposer = ({ value, busy, target, onValueChange, onSubmit, onCancel }) => {
258
+ const { t } = Hooks.useTranslation(meta.profile.key);
259
+ const handleKeyDown = useCallback((event) => {
260
+ if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
261
+ event.preventDefault();
262
+ if (!busy && value.trim()) onSubmit();
263
+ }
264
+ }, [
265
+ busy,
266
+ value,
267
+ onSubmit
268
+ ]);
269
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
270
+ target && /* @__PURE__ */ jsx("span", {
271
+ className: "text-sm text-fg-muted",
272
+ children: t("comment-line.label", {
273
+ file: target.file,
274
+ line: target.line
275
+ })
276
+ }),
277
+ /* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(Input.Textarea, {
278
+ autoFocus: true,
279
+ rows: 4,
280
+ placeholder: t("comment-placeholder.label"),
281
+ value,
282
+ onChange: (event) => onValueChange(event.target.value),
283
+ onKeyDown: handleKeyDown
284
+ }) }),
285
+ /* @__PURE__ */ jsxs(Layout.Flex, {
286
+ justify: "end",
287
+ gap: "sm",
288
+ children: [/* @__PURE__ */ jsx(Button.Root, {
289
+ onClick: onCancel,
290
+ children: t("comment-cancel.label")
291
+ }), /* @__PURE__ */ jsx(Button.Root, {
292
+ variant: "primary",
293
+ disabled: busy || !value.trim(),
294
+ onClick: onSubmit,
295
+ children: t("comment-submit.label")
296
+ })]
297
+ })
298
+ ] });
299
+ };
300
+ /** The composer as a band under the toolbar, for a comment on the pull request as a whole. */
301
+ var CommentBand = (props) => /* @__PURE__ */ jsx(Layout.Flex, {
302
+ column: true,
303
+ gap: "sm",
304
+ classNames: "p-3 border-b border-separator",
305
+ children: /* @__PURE__ */ jsx(CommentComposer, { ...props })
306
+ });
307
+ /**
308
+ * The composer floated at the diff line it addresses, so the reader reads the comment against the
309
+ * code it is about rather than against a band at the other end of the document.
310
+ */
311
+ var LineCommentPopover = ({ open, anchorRef, ...props }) => /* @__PURE__ */ jsx(Popover.Root, {
312
+ open,
313
+ onOpenChange: ({ open: next }) => {
314
+ if (!next) props.onCancel();
315
+ },
316
+ positioning: {
317
+ ...VirtualAnchor.virtualAnchor(anchorRef),
318
+ placement: "bottom-start"
319
+ },
320
+ children: /* @__PURE__ */ jsx(Popover.Content, {
321
+ classNames: "w-[28rem] max-w-[90cqi]",
322
+ children: /* @__PURE__ */ jsx(Popover.Body, {
323
+ classNames: "flex flex-col gap-2 p-2",
324
+ children: /* @__PURE__ */ jsx(CommentComposer, { ...props })
325
+ })
326
+ })
327
+ });
328
+ //#endregion
329
+ //#region src/components/PullRequestFiles/DiffStat.tsx
330
+ /** `+12 -3`, coloured as the diff gutters are, with a zero count left out. */
331
+ var DiffStat = ({ added, removed }) => /* @__PURE__ */ jsxs("span", {
332
+ className: "flex items-center gap-1 ps-2 text-xs tabular-nums whitespace-nowrap",
333
+ children: [added > 0 && /* @__PURE__ */ jsxs("span", {
334
+ className: "text-(--color-cm-diff-add-gutter)",
335
+ children: ["+", added]
336
+ }), removed > 0 && /* @__PURE__ */ jsxs("span", {
337
+ className: "text-(--color-cm-diff-remove-gutter)",
338
+ children: ["-", removed]
339
+ })]
340
+ });
341
+ //#endregion
342
+ //#region src/components/PullRequestFiles/FileTree.tsx
343
+ /**
344
+ * The changed files as a tree: a checkbox per file to mark it reviewed, its change counts at the
345
+ * trailing edge, and the file on screen as the current row.
346
+ */
347
+ var FileTree = ({ root, selected, reviewed, onSelect, onReviewedChange }) => {
348
+ const { t } = Hooks.useTranslation(meta.profile.key);
349
+ const [closed, setClosed] = useState(() => /* @__PURE__ */ new Set());
350
+ const model = useMemo(() => createStaticTreeModel(root, {
351
+ getChildren: (node) => node.children,
352
+ getProps: (node) => ({
353
+ label: node.name,
354
+ count: void 0,
355
+ testId: "pull-request.files.row"
356
+ }),
357
+ isOpen: (node) => !closed.has(node.id),
358
+ isCurrent: (node) => node.file !== void 0 && node.path === selected
359
+ }), [
360
+ root,
361
+ selected,
362
+ closed
363
+ ]);
364
+ const handleOpenChange = useCallback(({ item, open }) => setClosed((previous) => {
365
+ const next = new Set(previous);
366
+ if (open) next.delete(item.id);
367
+ else next.add(item.id);
368
+ return next;
369
+ }), []);
370
+ const handleSelect = useCallback(({ item }) => {
371
+ if (item.file) onSelect(item.path);
372
+ }, [onSelect]);
373
+ const renderRow = useCallback((node) => {
374
+ const item = node.item;
375
+ return /* @__PURE__ */ jsxs(Tree.Item, {
376
+ node,
377
+ children: [
378
+ /* @__PURE__ */ jsx(Tree.ItemIndicator, {}),
379
+ /* @__PURE__ */ jsx(Tree.ItemIcon, {
380
+ icon: item?.file ? void 0 : "ph--folder--regular",
381
+ children: item?.file && /* @__PURE__ */ jsx(Input.Checkbox, {
382
+ checked: reviewed.has(item.path),
383
+ onCheckedChange: ({ checked }) => onReviewedChange(item.path, checked === true),
384
+ onClick: (event) => event.stopPropagation(),
385
+ "aria-label": t("file-reviewed.label"),
386
+ "data-testid": "pull-request.files.reviewed"
387
+ })
388
+ }),
389
+ /* @__PURE__ */ jsx(Tree.ItemText, {}),
390
+ item && /* @__PURE__ */ jsx(DiffStat, {
391
+ added: item.added,
392
+ removed: item.removed
393
+ })
394
+ ]
395
+ });
396
+ }, [
397
+ reviewed,
398
+ onReviewedChange,
399
+ t
400
+ ]);
401
+ return /* @__PURE__ */ jsxs(Tree.Root, {
402
+ id: root.id,
403
+ model,
404
+ size: "sm",
405
+ onOpenChange: handleOpenChange,
406
+ onSelect: handleSelect,
407
+ children: [/* @__PURE__ */ jsx(Tree.Label, {
408
+ srOnly: true,
409
+ children: t("files-tree.label")
410
+ }), /* @__PURE__ */ jsx(Tree.Content, { children: renderRow })]
411
+ });
412
+ };
413
+ //#endregion
414
+ //#region src/components/WalkthroughView/extensions.ts
415
+ /** A definite content width, which the diff chunks cap themselves against. */
416
+ var slots = { content: { className: "dx-container-type-inline-size w-full mx-auto! max-w-[min(72rem,100%-3rem)] py-3!" } };
417
+ /**
418
+ * A read-only markdown document whose ```diff fences render as diff chunks — the one reading surface
419
+ * both a walkthrough and a single changed file are shown in, so the two cannot drift apart.
420
+ */
421
+ var diffDocumentExtensions = ({ themeMode, sidebar = "none", layout, onLineComment }) => [
422
+ createThemeExtensions({
423
+ themeMode,
424
+ slots
425
+ }),
426
+ createBasicExtensions({
427
+ lineWrapping: true,
428
+ readOnly: true
429
+ }),
430
+ createMarkdownExtensions(),
431
+ decorateMarkdown(),
432
+ scrollbarAutohide(),
433
+ walkthroughTheme(),
434
+ diffBlocks({
435
+ layout,
436
+ ...onLineComment ? { onLineComment } : {}
437
+ }),
438
+ sidebar === "none" ? [] : walkthroughSidebar({ variant: sidebar })
439
+ ];
440
+ //#endregion
441
+ //#region src/components/WalkthroughView/WalkthroughView.tsx
442
+ /**
443
+ * A read-only diff document: a whole walkthrough with its navigation rail, or one file's change as a
444
+ * single fence. Either way the chunks are the walkthrough's own, so a file reads the same in both.
445
+ */
446
+ var WalkthroughView = ({ value, sidebar, layout, onLineComment }) => {
447
+ const themeMode = Hooks.useThemeMode();
448
+ const extensions = useMemo(() => diffDocumentExtensions({
449
+ themeMode,
450
+ sidebar,
451
+ layout,
452
+ onLineComment
453
+ }), [
454
+ themeMode,
455
+ sidebar,
456
+ layout,
457
+ onLineComment
458
+ ]);
459
+ const markdown = useMemo(() => spaceHeadings(value), [value]);
460
+ return /* @__PURE__ */ jsx(TextEditor, {
461
+ value: markdown,
462
+ extensions,
463
+ focusable: false,
464
+ classNames: "dx-expand overflow-hidden"
465
+ });
466
+ };
467
+ /** What the walkthrough tab shows before there is a walkthrough: the offer to write one, or its progress. */
468
+ var WalkthroughPlaceholder = ({ generating, onGenerate }) => {
469
+ const { t } = Hooks.useTranslation(meta.profile.key);
470
+ return /* @__PURE__ */ jsxs(Layout.Flex, {
471
+ column: true,
472
+ center: true,
473
+ gap: "md",
474
+ classNames: "dx-expand",
475
+ children: [/* @__PURE__ */ jsx(Status.Empty, { children: t(generating ? "walkthrough-generating.message" : "no-walkthrough.message") }), !generating && /* @__PURE__ */ jsx(Button.Root, {
476
+ variant: "primary",
477
+ onClick: onGenerate,
478
+ children: t("generate-walkthrough.label")
479
+ })]
480
+ });
481
+ };
482
+ //#endregion
483
+ //#region src/components/PullRequestFiles/PullRequestFiles.tsx
484
+ /**
485
+ * Every changed file, one at a time: the file's diff rendered as a walkthrough chunk, beside a rail
486
+ * listing the changed files as a tree the reader checks off as they go.
487
+ */
488
+ var PullRequestFiles = ({ tree, file, reviewed, total, error, onSelect, onReviewedChange, onLineComment }) => {
489
+ const { t } = Hooks.useTranslation(meta.profile.key);
490
+ const fence = useMemo(() => file && file.hunks.length > 0 ? diffFence(file) : void 0, [file]);
491
+ if (error) return /* @__PURE__ */ jsx(Status.Empty, {
492
+ icon: "ph--warning--regular",
493
+ classNames: "dx-expand",
494
+ children: error
495
+ });
496
+ if (!tree) return /* @__PURE__ */ jsx(Status.Empty, {
497
+ classNames: "dx-expand",
498
+ children: t("files-loading.message")
499
+ });
500
+ return /* @__PURE__ */ jsxs(Layout.Grid, {
501
+ grow: true,
502
+ cols: ["fill", "18rem"],
503
+ "data-testid": "pull-request.files",
504
+ children: [fence ? /* @__PURE__ */ jsx(WalkthroughView, {
505
+ value: fence,
506
+ onLineComment
507
+ }, file?.path) : /* @__PURE__ */ jsx(Status.Empty, {
508
+ classNames: "dx-expand",
509
+ children: t(file ? "file-no-diff.message" : "no-files.message")
510
+ }), /* @__PURE__ */ jsx(ScrollArea.Root, {
511
+ classNames: "border-s border-separator-subtle",
512
+ children: /* @__PURE__ */ jsxs(ScrollArea.Viewport, {
513
+ classNames: "p-2",
514
+ children: [/* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(Field.Label, {
515
+ classNames: "px-2",
516
+ children: t("files-reviewed.label", {
517
+ reviewed: reviewed.size,
518
+ total
519
+ })
520
+ }) }), /* @__PURE__ */ jsx(FileTree, {
521
+ root: tree,
522
+ selected: file?.path,
523
+ reviewed,
524
+ onSelect,
525
+ onReviewedChange
526
+ })]
527
+ })
528
+ })]
529
+ });
530
+ };
531
+ //#endregion
532
+ //#region src/components/PullRequestOverview/ArtifactPill.tsx
533
+ /** The leading icon for each kind of artifact. */
534
+ var artifactIcon = {
535
+ video: "ph--film-strip--regular",
536
+ image: "ph--image--regular",
537
+ file: "ph--file--regular"
538
+ };
539
+ /** The image or video itself, or nothing for a file the browser cannot show inline. */
540
+ var ArtifactMedia = ({ artifact, classNames }) => artifact.kind === "video" ? /* @__PURE__ */ jsx("video", {
541
+ src: artifact.url,
542
+ controls: true,
543
+ muted: true,
544
+ playsInline: true,
545
+ preload: "metadata",
546
+ className: ["block w-full bg-black rounded-sm", classNames].filter(Boolean).join(" "),
547
+ "data-testid": "pull-request.artifact.video"
548
+ }) : artifact.kind === "image" ? /* @__PURE__ */ jsx("img", {
549
+ src: artifact.url,
550
+ alt: artifact.label ?? artifact.name,
551
+ loading: "lazy",
552
+ className: ["block w-full object-contain rounded-sm", classNames].filter(Boolean).join(" "),
553
+ "data-testid": "pull-request.artifact.image"
554
+ }) : null;
555
+ /**
556
+ * An artifact link as a pill that previews its image or video in place, so a reader sees the demo
557
+ * without leaving the pull request. The outline matches the anchor chip a GitHub link becomes, so
558
+ * the body's links read as one kind of thing.
559
+ */
560
+ var ArtifactPill = ({ artifact, children }) => {
561
+ const label = typeof children === "string" && children !== artifact.url ? children : artifact.name;
562
+ if (artifact.kind === "file") return /* @__PURE__ */ jsx("a", {
563
+ href: artifact.url,
564
+ target: "_blank",
565
+ rel: "noopener noreferrer",
566
+ className: "dx-tag-anchor",
567
+ children: label
568
+ });
569
+ return /* @__PURE__ */ jsxs(Popover.Root, {
570
+ autoFocus: false,
571
+ children: [/* @__PURE__ */ jsx(Popover.Trigger, {
572
+ asChild: true,
573
+ children: /* @__PURE__ */ jsx(Button.Root, {
574
+ hue: "neutral",
575
+ size: "sm",
576
+ classNames: "bg-input-surface text-fg font-normal ring-inset ring ring-neutral-border hover:bg-hover-surface hover:ring-info-border align-baseline",
577
+ icon: artifactIcon[artifact.kind],
578
+ iconClassNames: artifact.kind === "video" ? "text-violet-text" : "text-sky-text",
579
+ label,
580
+ "data-testid": "pull-request.artifact.pill"
581
+ })
582
+ }), /* @__PURE__ */ jsx(Popover.Content, {
583
+ classNames: "w-[min(40rem,90vw)]",
584
+ children: /* @__PURE__ */ jsx(Popover.Body, {
585
+ classNames: "p-1",
586
+ children: /* @__PURE__ */ jsx(ArtifactMedia, { artifact })
587
+ })
588
+ })]
589
+ });
590
+ };
591
+ //#endregion
592
+ //#region src/components/PullRequestOverview/CheckRunList.tsx
593
+ var outcomeIcon = {
594
+ failure: {
595
+ icon: "ph--x-circle--fill",
596
+ classNames: "text-error-text"
597
+ },
598
+ pending: {
599
+ icon: "ph--circle-notch--regular",
600
+ classNames: "text-warning-text animate-spin"
601
+ },
602
+ success: {
603
+ icon: "ph--check-circle--fill",
604
+ classNames: "text-success-text"
605
+ },
606
+ neutral: {
607
+ icon: "ph--minus-circle--regular",
608
+ classNames: "text-fg-muted"
609
+ },
610
+ skipped: {
611
+ icon: "ph--prohibit--regular",
612
+ classNames: "text-fg-muted"
613
+ }
614
+ };
615
+ var outcomeOrder = [
616
+ "failure",
617
+ "pending",
618
+ "success",
619
+ "neutral",
620
+ "skipped"
621
+ ];
622
+ /**
623
+ * `4m 12s` from start to finish, or to `now` for a run still in progress;
624
+ * undefined for a run that has not started, or has not finished when no `now` is given.
625
+ */
626
+ var formatDuration = (startedAt, completedAt, now) => {
627
+ const end = completedAt ? Date.parse(completedAt) : now;
628
+ if (!startedAt || end === void 0) return;
629
+ const seconds = Math.max(0, Math.round((end - Date.parse(startedAt)) / 1e3));
630
+ if (Number.isNaN(seconds)) return;
631
+ const minutes = Math.floor(seconds / 60);
632
+ return minutes > 0 ? `${minutes}m ${seconds % 60}s` : `${seconds}s`;
633
+ };
634
+ /** The current time, re-rendering once a second while `active` so elapsed times stay current. */
635
+ var useNow = (active) => {
636
+ const [now, setNow] = useState(() => Date.now());
637
+ useEffect(() => {
638
+ if (!active) return;
639
+ setNow(Date.now());
640
+ const interval = setInterval(() => setNow(Date.now()), 1e3);
641
+ return () => clearInterval(interval);
642
+ }, [active]);
643
+ return now;
644
+ };
645
+ /** Sorts runs by what needs attention, then by name so shards read in order. */
646
+ var sortCheckRuns = (runs) => [...runs].sort((a, b) => outcomeOrder.indexOf(a.outcome) - outcomeOrder.indexOf(b.outcome) || a.name.localeCompare(b.name, void 0, { numeric: true }));
647
+ /** Every check on the head commit: its outcome, how long it took, and its logs a click away. */
648
+ var CheckRunList = ({ runs }) => {
649
+ const { t } = Hooks.useTranslation(meta.profile.key);
650
+ const sorted = useMemo(() => runs ? sortCheckRuns(runs) : void 0, [runs]);
651
+ const summary = useCheckSummary(runs);
652
+ const now = useNow(runs?.some((run) => run.outcome === "pending" && run.startedAt) ?? false);
653
+ if (!sorted || sorted.length === 0) return /* @__PURE__ */ jsx(Status.Empty, { children: t(sorted ? "no-checks.message" : "checks-loading.message") });
654
+ return /* @__PURE__ */ jsx(Listbox.Root, {
655
+ items: sorted.map((run) => ({
656
+ value: `${run.name}-${run.url ?? ""}`,
657
+ label: run.name
658
+ })),
659
+ children: /* @__PURE__ */ jsx(Listbox.Content, {
660
+ "aria-label": summary,
661
+ "data-testid": "pull-request.checks",
662
+ children: sorted.map((run) => {
663
+ const { icon, classNames } = outcomeIcon[run.outcome];
664
+ const duration = formatDuration(run.startedAt, run.completedAt, run.outcome === "pending" ? now : void 0);
665
+ const detail = run.conclusion && run.conclusion !== run.outcome && run.conclusion !== "failure" ? run.conclusion.replace(/_/g, " ") : void 0;
666
+ const outcome = run.outcome === "skipped" ? t("check-outcome.skipped.label") : run.outcome === "pending" ? [t("check-outcome.pending.label"), duration].filter(Boolean).join(" · ") : duration ?? t(`check-outcome.${run.outcome}.label`);
667
+ const url = run.url;
668
+ return /* @__PURE__ */ jsxs(Listbox.Item, {
669
+ id: `${run.name}-${url ?? ""}`,
670
+ "data-outcome": run.outcome,
671
+ "data-testid": "pull-request.check",
672
+ onClick: url ? () => window.open(url, "_blank", "noopener,noreferrer") : void 0,
673
+ children: [
674
+ /* @__PURE__ */ jsx(Listbox.ItemIcon, {
675
+ icon,
676
+ classNames
677
+ }),
678
+ /* @__PURE__ */ jsx(Listbox.ItemText, { children: run.name }),
679
+ /* @__PURE__ */ jsx(Listbox.ItemDescription, { children: [detail, outcome].filter(Boolean).join(" · ") })
680
+ ]
681
+ }, `${run.name}-${url ?? ""}`);
682
+ })
683
+ })
684
+ });
685
+ };
686
+ /** The label the checks section carries: the counts once there are runs to count. */
687
+ var useCheckSummary = (runs) => {
688
+ const { t } = Hooks.useTranslation(meta.profile.key);
689
+ return useMemo(() => {
690
+ if (!runs || runs.length === 0) return t("checks.label");
691
+ const counts = {
692
+ success: 0,
693
+ failure: 0,
694
+ pending: 0,
695
+ skipped: 0,
696
+ neutral: 0
697
+ };
698
+ for (const run of runs) counts[run.outcome]++;
699
+ return t("checks-summary.label", {
700
+ passed: counts.success + counts.neutral,
701
+ failed: counts.failure,
702
+ pending: counts.pending,
703
+ skipped: counts.skipped
704
+ });
705
+ }, [runs, t]);
706
+ };
707
+ //#endregion
708
+ //#region src/components/PullRequestOverview/PullRequestDetails.tsx
709
+ /** What the overview's details section shows, as a read-only form: one row per fact about the pull request. */
710
+ var PullRequestDetailsSchema = Schema.Struct({
711
+ reference: Schema.String.annotate({ title: "Pull request" }),
712
+ state: Schema.optional(Schema.String.annotate({ title: "State" })),
713
+ checks: Schema.optional(Schema.String.annotate({ title: "Checks" })),
714
+ branches: Schema.optional(Schema.String.annotate({ title: "Branches" }))
715
+ });
716
+ var VIDEO_EXTENSIONS = [
717
+ "webm",
718
+ "mp4",
719
+ "mov",
720
+ "m4v",
721
+ "ogv"
722
+ ];
723
+ var IMAGE_EXTENSIONS = [
724
+ "png",
725
+ "jpg",
726
+ "jpeg",
727
+ "gif",
728
+ "webp",
729
+ "svg",
730
+ "avif"
731
+ ];
732
+ /** The artifact a URL names, or undefined when it is not in the artifacts bucket. */
733
+ var parseArtifactLink = (url) => {
734
+ let parsed;
735
+ try {
736
+ parsed = new URL(url);
737
+ } catch {
738
+ return;
739
+ }
740
+ if (parsed.protocol !== "https:" || parsed.hostname !== "pub-39066a86073446d7b77b1c157b660bb5.r2.dev") return;
741
+ const segment = parsed.pathname.split("/").at(-1) ?? "";
742
+ if (!segment) return;
743
+ const name = safeDecode(segment);
744
+ const extension = name.split(".").at(-1)?.toLowerCase() ?? "";
745
+ return {
746
+ url,
747
+ kind: VIDEO_EXTENSIONS.includes(extension) ? "video" : IMAGE_EXTENSIONS.includes(extension) ? "image" : "file",
748
+ name
749
+ };
750
+ };
751
+ var CLAUDE_SESSION = /https:\/\/claude\.ai\/code\/session_[A-Za-z0-9]+/;
752
+ var PREVIEW_BLOCK = /<!--\s*composer-preview:begin\s*-->([\s\S]*?)<!--\s*composer-preview:end\s*-->/;
753
+ var PREVIEW_LINE = /^\s*🚀\s*Composer preview:\s*(https?:\/\/\S+)\s*$/m;
754
+ var FOOTER_LINES = [
755
+ /^\s*🤖\s*Generated with \[?Claude Code\]?(\([^)]*\))?\s*$/,
756
+ /^\s*_?Generated by \[Claude Code\]\([^)]*\)_?\s*$/,
757
+ new RegExp(`^\\s*<?${CLAUDE_SESSION.source}>?\\s*$`)
758
+ ];
759
+ var MARKDOWN_LINK = /!?\[([^\]]*)\]\((https?:\/\/[^\s)]+)\)/g;
760
+ var BARE_URL = /https?:\/\/[^\s)<>\]|]+/g;
761
+ /**
762
+ * Splits a pull request body into its prose and what the footers and links say.
763
+ *
764
+ * The footers are the harness's (`🤖 Generated with Claude Code` and the session URL) and CI's
765
+ * (the Composer preview block); the article shows them as cards, so they are taken out of the prose
766
+ * rather than rendered twice.
767
+ */
768
+ var parsePullRequestBody = (body) => {
769
+ let text = (body ?? "").replace(/\r\n/g, "\n");
770
+ const sessionUrl = text.match(CLAUDE_SESSION)?.[0];
771
+ const hasClaudeFooter = FOOTER_LINES.slice(0, 2).some((pattern) => text.split("\n").some((line) => pattern.test(line)));
772
+ let previewUrl;
773
+ const block = text.match(PREVIEW_BLOCK);
774
+ if (block) {
775
+ previewUrl = block[1].match(PREVIEW_LINE)?.[1];
776
+ text = text.replace(PREVIEW_BLOCK, "");
777
+ }
778
+ const line = text.match(PREVIEW_LINE);
779
+ if (line) {
780
+ previewUrl ??= line[1];
781
+ text = text.replace(PREVIEW_LINE, "");
782
+ }
783
+ const lines = text.split("\n").filter((line) => !FOOTER_LINES.some((pattern) => pattern.test(line)));
784
+ while (lines.length > 0 && /^\s*(---+|\*\*\*+|___+)?\s*$/.test(lines[lines.length - 1])) lines.pop();
785
+ const markdown = lines.join("\n").trim();
786
+ return {
787
+ markdown,
788
+ ...hasClaudeFooter || sessionUrl ? { claudeCode: sessionUrl ? { sessionUrl } : {} } : {},
789
+ ...previewUrl ? { previewUrl } : {},
790
+ artifacts: findArtifacts(markdown)
791
+ };
792
+ };
793
+ /** Every artifact the prose links, in order of first mention. */
794
+ var findArtifacts = (markdown) => {
795
+ const found = /* @__PURE__ */ new Map();
796
+ const add = (url, label) => {
797
+ const artifact = found.has(url) ? void 0 : parseArtifactLink(url);
798
+ if (artifact) found.set(url, {
799
+ ...artifact,
800
+ ...label && label !== url ? { label } : {}
801
+ });
802
+ };
803
+ for (const [, label, url] of markdown.matchAll(MARKDOWN_LINK)) add(url, label);
804
+ for (const [url] of markdown.replace(MARKDOWN_LINK, "").matchAll(BARE_URL)) add(url);
805
+ return [...found.values()].sort((a, b) => markdown.indexOf(a.url) - markdown.indexOf(b.url));
806
+ };
807
+ var safeDecode = (segment) => {
808
+ try {
809
+ return decodeURIComponent(segment);
810
+ } catch {
811
+ return segment;
812
+ }
813
+ };
814
+ //#endregion
815
+ //#region src/components/PullRequestOverview/RelatedCards.tsx
816
+ /** What {@link RelatedCards} would show; empty when the pull request links to nothing beyond its diff. */
817
+ var useRelatedItems = ({ artifacts, claudeCode, previewUrl }) => {
818
+ const { t } = Hooks.useTranslation(meta.profile.key);
819
+ return useMemo(() => {
820
+ const items = artifacts.map((artifact) => ({
821
+ kind: "artifact",
822
+ id: artifact.url,
823
+ artifact
824
+ }));
825
+ if (previewUrl) items.push({
826
+ kind: "link",
827
+ id: "preview",
828
+ icon: "ph--rocket-launch--regular",
829
+ iconClassNames: "text-success-text",
830
+ title: t("preview-deployment.label"),
831
+ href: previewUrl,
832
+ detail: hostOf(previewUrl)
833
+ });
834
+ if (claudeCode) items.push({
835
+ kind: "link",
836
+ id: "claude",
837
+ icon: "px--anthropic--regular",
838
+ iconClassNames: "text-warning-text",
839
+ title: claudeCode.sessionUrl ? t("claude-session.label") : t("claude-generated.label"),
840
+ href: claudeCode.sessionUrl,
841
+ detail: claudeCode.sessionUrl?.split("/").at(-1)
842
+ });
843
+ return items;
844
+ }, [
845
+ artifacts,
846
+ claudeCode,
847
+ previewUrl,
848
+ t
849
+ ]);
850
+ };
851
+ /**
852
+ * What the pull request points at beyond its diff, one card each — its demo media, the preview
853
+ * deployment built from it, and the session that wrote it — in the masonry grid related objects
854
+ * use everywhere else. Renders inside its host's scroller rather than owning one.
855
+ */
856
+ var RelatedCards = ({ items }) => /* @__PURE__ */ jsx(Masonry.Root, {
857
+ Tile: RelatedCard,
858
+ centered: false,
859
+ children: /* @__PURE__ */ jsx(Masonry.Viewport, {
860
+ items,
861
+ getId: (item) => item.id,
862
+ scroll: false
863
+ })
864
+ });
865
+ var RelatedCard = ({ data: item }) => {
866
+ const { t } = Hooks.useTranslation(meta.profile.key);
867
+ if (item.kind === "link") return /* @__PURE__ */ jsxs(Card.Root, {
868
+ "data-testid": `pull-request.related.${item.id}`,
869
+ children: [/* @__PURE__ */ jsx(CardHeading, {
870
+ icon: item.icon,
871
+ iconClassNames: item.iconClassNames,
872
+ title: item.title,
873
+ href: item.href
874
+ }), item.detail && /* @__PURE__ */ jsx(Card.Row, { children: /* @__PURE__ */ jsx(Card.Text, {
875
+ variant: "muted",
876
+ truncate: true,
877
+ children: item.detail
878
+ }) })]
879
+ });
880
+ const { artifact } = item;
881
+ return /* @__PURE__ */ jsxs(Card.Root, {
882
+ "data-testid": "pull-request.related.artifact",
883
+ children: [
884
+ /* @__PURE__ */ jsx(CardHeading, {
885
+ icon: artifactIcon[artifact.kind],
886
+ title: artifact.label ?? t(`artifact-${artifact.kind}.label`),
887
+ href: artifact.url
888
+ }),
889
+ /* @__PURE__ */ jsx(Card.Row, { children: /* @__PURE__ */ jsx(Card.Text, {
890
+ variant: "muted",
891
+ truncate: true,
892
+ children: artifact.name
893
+ }) }),
894
+ artifact.kind !== "file" && /* @__PURE__ */ jsx(Card.Body, { children: /* @__PURE__ */ jsx(ArtifactMedia, {
895
+ artifact,
896
+ classNames: "col-span-3 aspect-video max-h-[200px] object-cover"
897
+ }) })
898
+ ]
899
+ });
900
+ };
901
+ var CardHeading = ({ icon, iconClassNames, title, href }) => {
902
+ const { t } = Hooks.useTranslation(meta.profile.key);
903
+ return /* @__PURE__ */ jsxs(Card.Header, { children: [
904
+ /* @__PURE__ */ jsx(Layout.Block, { children: /* @__PURE__ */ jsx(Icon.Icon, {
905
+ icon,
906
+ classNames: iconClassNames
907
+ }) }),
908
+ /* @__PURE__ */ jsx(Card.Title, { children: title }),
909
+ href && /* @__PURE__ */ jsx(Layout.Block, {
910
+ rail: "end",
911
+ children: /* @__PURE__ */ jsx(Button.Root, {
912
+ iconOnly: true,
913
+ variant: "ghost",
914
+ icon: "ph--arrow-square-out--regular",
915
+ label: t("open-link.label"),
916
+ onClick: () => window.open(href, "_blank", "noopener,noreferrer")
917
+ })
918
+ })
919
+ ] });
920
+ };
921
+ var hostOf = (url) => {
922
+ try {
923
+ return new URL(url).host;
924
+ } catch {
925
+ return url;
926
+ }
927
+ };
928
+ //#endregion
929
+ //#region src/components/PullRequestOverview/PullRequestOverview.tsx
930
+ /**
931
+ * A pull request as its author presented it: the description, the facts about it, what it links to
932
+ * beyond the diff, and every check on its head commit.
933
+ */
934
+ var PullRequestOverview = ({ body, details, runs }) => {
935
+ const { t } = Hooks.useTranslation(meta.profile.key);
936
+ const parsed = useMemo(() => parsePullRequestBody(body), [body]);
937
+ const components = useBodyComponents();
938
+ const related = useRelatedItems(parsed);
939
+ const checkSummary = useCheckSummary(runs);
940
+ return /* @__PURE__ */ jsx(Form.Root, {
941
+ schema: PullRequestDetailsSchema,
942
+ values: details,
943
+ layout: "static",
944
+ readonly: true,
945
+ children: /* @__PURE__ */ jsx(Form.Viewport, {
946
+ scroll: true,
947
+ width: "document",
948
+ children: /* @__PURE__ */ jsxs(Form.Content, { children: [
949
+ parsed.markdown ? /* @__PURE__ */ jsx(MarkdownView, {
950
+ content: parsed.markdown,
951
+ components,
952
+ "data-testid": "pull-request.body"
953
+ }) : /* @__PURE__ */ jsx(Status.Empty, { children: t("no-description.message") }),
954
+ /* @__PURE__ */ jsx(Form.FieldSet, {
955
+ label: t("details.label"),
956
+ "data-testid": "pull-request.details",
957
+ children: /* @__PURE__ */ jsx(Form.Fields, {})
958
+ }),
959
+ related.length > 0 && /* @__PURE__ */ jsx(Form.FieldSet, {
960
+ label: t("related.label"),
961
+ children: /* @__PURE__ */ jsx(RelatedCards, { items: related })
962
+ }),
963
+ /* @__PURE__ */ jsx(Form.FieldSet, {
964
+ label: checkSummary,
965
+ children: /* @__PURE__ */ jsx(CheckRunList, { runs })
966
+ })
967
+ ] })
968
+ })
969
+ });
970
+ };
971
+ /**
972
+ * Links in the body as pills: an artifact previews its media in place, and a link a preview
973
+ * resolver answers (another pull request, an issue) becomes the anchor chip the editor makes of it.
974
+ */
975
+ var useBodyComponents = () => {
976
+ const resolvers = Hooks$1.useCapabilities(PreviewCapabilities.LinkResolver);
977
+ return useMemo(() => ({ a: ({ children, href, node: _node, ...props }) => {
978
+ const artifact = href ? parseArtifactLink(href) : void 0;
979
+ if (artifact) return /* @__PURE__ */ jsx(ArtifactPill, {
980
+ artifact,
981
+ children
982
+ });
983
+ const all = resolvers.flat();
984
+ if (!href || !PreviewCapabilities.isPreviewLink(all, href)) return /* @__PURE__ */ jsx(MarkdownLink, {
985
+ href,
986
+ ...props,
987
+ children
988
+ });
989
+ const icon = PreviewCapabilities.linkIcon(all, href);
990
+ return /* @__PURE__ */ jsxs(DxAnchor, {
991
+ eid: href,
992
+ className: "dx-tag-anchor",
993
+ children: [icon && /* @__PURE__ */ jsx(Icon.Icon, {
994
+ icon: icon.icon,
995
+ size: "md",
996
+ classNames: ["inline-block align-[-0.125em] me-1", icon.classNames]
997
+ }), children === href ? PreviewCapabilities.linkLabel(all, href) ?? children : children]
998
+ });
999
+ } }), [resolvers]);
1000
+ };
1001
+ //#endregion
1002
+ //#region src/components/PullRequestStatus/PullRequestStatus.tsx
1003
+ var stateHue = {
1004
+ open: "green",
1005
+ closed: "red",
1006
+ merged: "purple",
1007
+ draft: "neutral"
1008
+ };
1009
+ var reviewHue = {
1010
+ approved: "green",
1011
+ changes_requested: "red",
1012
+ none: "neutral"
1013
+ };
1014
+ var ciHue = {
1015
+ success: "green",
1016
+ failure: "red",
1017
+ pending: "amber",
1018
+ none: "neutral"
1019
+ };
1020
+ /** One line answering where the pull request stands: open or merged, approved or not, CI green or red. */
1021
+ var PullRequestStatus = ({ reference, title, state, review, ci }) => {
1022
+ const { t } = Hooks.useTranslation(meta.profile.key);
1023
+ return /* @__PURE__ */ jsxs(Layout.Flex, {
1024
+ align: "center",
1025
+ gap: "sm",
1026
+ role: "status",
1027
+ classNames: "px-3 py-1.5 border-b border-separator-subtle text-sm min-w-0",
1028
+ "data-testid": "pull-request.status",
1029
+ children: [
1030
+ /* @__PURE__ */ jsx("span", {
1031
+ className: "dx-tag dx-tag-inline shrink-0",
1032
+ "data-hue": "neutral",
1033
+ children: reference
1034
+ }),
1035
+ title && /* @__PURE__ */ jsx("span", {
1036
+ className: "truncate grow",
1037
+ children: title
1038
+ }),
1039
+ /* @__PURE__ */ jsxs(Layout.Flex, {
1040
+ align: "center",
1041
+ gap: "sm",
1042
+ classNames: "shrink-0 ml-auto",
1043
+ children: [
1044
+ state && /* @__PURE__ */ jsx("span", {
1045
+ className: "dx-tag dx-tag-inline",
1046
+ "data-hue": stateHue[state],
1047
+ "data-testid": "pull-request.status.state",
1048
+ children: t(`pull-request-state.${state}.label`)
1049
+ }),
1050
+ /* @__PURE__ */ jsx("span", {
1051
+ className: "dx-tag dx-tag-inline",
1052
+ "data-hue": review ? reviewHue[review.state] : "neutral",
1053
+ "data-testid": "pull-request.status.review",
1054
+ children: review ? t(`review-status.${review.state}.label`, { count: review.approvals }) : t("review-status.unknown.label")
1055
+ }),
1056
+ /* @__PURE__ */ jsxs("span", {
1057
+ className: "dx-tag dx-tag-inline",
1058
+ "data-hue": ci ? ciHue[ci.state] : "neutral",
1059
+ "data-testid": "pull-request.status.ci",
1060
+ children: [ci ? t(`ci-status.${ci.state}.label`) : t("ci-status.unknown.label"), ci && ci.checks.total > 0 && ` ${ci.checks.passed}/${ci.checks.total}`]
1061
+ })
1062
+ ]
1063
+ })
1064
+ ]
1065
+ });
1066
+ };
1067
+ //#endregion
1068
+ //#region src/containers/PullRequestArticle/failure.ts
1069
+ /**
1070
+ * Names a pull-request action's failure so the user knows what to do about it.
1071
+ *
1072
+ * A rejected credential is the one failure the user can fix themselves, and it is indistinguishable
1073
+ * from any other error once it reaches the toast as `error.message` — GitHub answers it as a bare
1074
+ * `401`, which surfaces as `StatusCode: non 2xx status code (401 GET …)`. Matches the same
1075
+ * distinction `ImportPullRequestDialog` already draws on `tokenStatus`.
1076
+ */
1077
+ var pullRequestFailureKey = (error, fallbackKey) => responseStatus(error) === 401 ? "github-token-rejected.title" : fallbackKey;
1078
+ //#endregion
1079
+ //#region src/containers/PullRequestArticle/PullRequestArticle.tsx
1080
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-github/src/containers/PullRequestArticle/PullRequestArticle.tsx";
1081
+ var ciLabel = {
1082
+ success: "ci-status.success.label",
1083
+ failure: "ci-status.failure.label",
1084
+ pending: "ci-status.pending.label",
1085
+ none: "ci-status.none.label"
1086
+ };
1087
+ var TABS = [
1088
+ "overview",
1089
+ "walkthrough",
1090
+ "files"
1091
+ ];
1092
+ /**
1093
+ * A pull request read as a review: its number, state and CI outcome above whatever narration the
1094
+ * space holds, with approving and commenting one click away. Everything GitHub-side goes through
1095
+ * the space's GitHub connection.
1096
+ *
1097
+ * The pull request is the subject rather than the walkthrough because one exists before the other
1098
+ * does: a pull request just imported has no narration yet, and generating it is an action ON the
1099
+ * pull request, not a different object to open.
1100
+ */
1101
+ var PullRequestArticle = ({ role, attendableId, subject: pullRequest }) => {
1102
+ const { t } = Hooks.useTranslation(meta.profile.key);
1103
+ const { invokePromise } = Hooks$1.useOperationInvoker();
1104
+ const [subject] = useObject(pullRequest);
1105
+ const db = Obj.getDatabase(pullRequest);
1106
+ const spaceId = db?.spaceId;
1107
+ const walkthroughs = useQuery(db, Filter.type(Walkthrough.Walkthrough, { pullRequest: Ref.make(pullRequest) }));
1108
+ const walkthrough = useMemo(() => newestWalkthrough(walkthroughs), [walkthroughs]);
1109
+ const walkthroughProgress = ToolkitHooks.useProgressMonitor(GitHubOperation.createWalkthroughProgressKey(pullRequest));
1110
+ const progressRegistry = Hooks$1.useOptionalCapability(AppCapabilities.ProgressRegistry);
1111
+ const [status, setStatus] = useState();
1112
+ const state = status?.state ?? subject.state;
1113
+ const [tab, setTab] = useState("overview");
1114
+ const [busy, setBusy] = useState(false);
1115
+ const [generating, setGenerating] = useState(false);
1116
+ const [composing, setComposing] = useState(false);
1117
+ const [comment, setComment] = useState("");
1118
+ const [lineTarget, setLineTarget] = useState();
1119
+ const lineAnchorRef = useRef(null);
1120
+ const openLineComment = useCallback((target, anchor, commit) => {
1121
+ lineAnchorRef.current = anchor;
1122
+ setLineTarget({
1123
+ target,
1124
+ commit
1125
+ });
1126
+ setComposing(true);
1127
+ }, []);
1128
+ const handleWalkthroughLineComment = useCallback((target, anchor) => walkthrough && openLineComment(target, anchor, walkthrough.commit), [walkthrough, openLineComment]);
1129
+ /** The toolbar's composer is about the pull request, so it drops whatever line was targeted. */
1130
+ const handleToggleComposer = useCallback(() => {
1131
+ setLineTarget(void 0);
1132
+ lineAnchorRef.current = null;
1133
+ setComposing((value) => value === false || lineTarget !== void 0);
1134
+ }, [lineTarget]);
1135
+ const handleCloseComposer = useCallback(() => {
1136
+ setComposing(false);
1137
+ setLineTarget(void 0);
1138
+ lineAnchorRef.current = null;
1139
+ }, []);
1140
+ const pullRequestRef = useMemo(() => Ref.make(pullRequest), [pullRequest]);
1141
+ const reference = PullRequest.reference(pullRequest);
1142
+ const diff = usePullRequestDiff(pullRequestRef, spaceId, tab === "files");
1143
+ const files = usePullRequestFiles(diff.diff, `${meta.profile.key}.reviewed.${reference}`);
1144
+ const { file, step, setReviewed } = files;
1145
+ const handleFilesLineComment = useCallback((target, anchor) => diff.commit && openLineComment(target, anchor, diff.commit), [diff.commit, openLineComment]);
1146
+ /** Checking a file off moves on to the next one, the way a reader works down the list. */
1147
+ const handleToggleReviewed = useCallback(() => {
1148
+ if (!file) return;
1149
+ const reviewed = !files.reviewed.has(file.path);
1150
+ setReviewed(file.path, reviewed);
1151
+ if (reviewed) step(1);
1152
+ }, [
1153
+ file,
1154
+ files.reviewed,
1155
+ setReviewed,
1156
+ step
1157
+ ]);
1158
+ const refreshStatus = useCallback(async () => {
1159
+ const { data, error } = await invokePromise(GitHubOperation.GetPullRequestStatus, { pullRequest: pullRequestRef }, { spaceId });
1160
+ if (error) {
1161
+ log.warn("pull request status failed", { error }, {
1162
+ "~LogMeta": "~LogMeta",
1163
+ F: __dxlog_file,
1164
+ L: 167,
1165
+ S: void 0
1166
+ });
1167
+ return;
1168
+ }
1169
+ if (data) setStatus({
1170
+ state: data.state,
1171
+ body: data.body,
1172
+ ci: data.ci,
1173
+ checks: data.checks,
1174
+ runs: data.runs,
1175
+ review: data.review,
1176
+ approvals: data.approvals
1177
+ });
1178
+ }, [
1179
+ invokePromise,
1180
+ pullRequestRef,
1181
+ spaceId
1182
+ ]);
1183
+ useEffect(() => {
1184
+ refreshStatus();
1185
+ }, [refreshStatus]);
1186
+ useSyncPullRequest(pullRequest);
1187
+ const toast = useCallback((id, title, success, description) => invokePromise(LayoutOperation.AddToast, {
1188
+ id: `${meta.profile.key}.${id}`,
1189
+ icon: success ? "ph--check-circle--regular" : "ph--warning--regular",
1190
+ title: [title, { ns: meta.profile.key }],
1191
+ ...description ? { description } : {}
1192
+ }), [invokePromise]);
1193
+ /**
1194
+ * A rejected credential is the one failure the user can fix, so it names the fix and links to the
1195
+ * connection; any other failure shows the raw error under the action's own title.
1196
+ */
1197
+ const failureToast = useCallback(async (id, fallbackKey, error) => {
1198
+ const key = pullRequestFailureKey(error, fallbackKey);
1199
+ if (key === fallbackKey || !db) return toast(id, key, false, error.message);
1200
+ const connection = (await EffectEx.runPromise(githubConnection().pipe(Effect.provide(Database.layer(db)), Effect.orElseSucceed(() => void 0))))?.connection;
1201
+ return invokePromise(LayoutOperation.AddToast, {
1202
+ id: `${meta.profile.key}.${id}`,
1203
+ icon: "ph--warning--regular",
1204
+ title: [key, { ns: meta.profile.key }],
1205
+ ...connection ? {
1206
+ actionLabel: ["open-github-connection.label", { ns: meta.profile.key }],
1207
+ actionAlt: ["open-github-connection.label", { ns: meta.profile.key }],
1208
+ onAction: () => void invokePromise(LayoutOperation.Open, {
1209
+ subject: [Binding.connectionSubject(db.spaceId, connection.id)],
1210
+ navigation: "immediate"
1211
+ })
1212
+ } : {}
1213
+ });
1214
+ }, [
1215
+ db,
1216
+ invokePromise,
1217
+ toast
1218
+ ]);
1219
+ const handleApprove = useCallback(async () => {
1220
+ setBusy(true);
1221
+ const { data, error } = await invokePromise(GitHubOperation.SubmitPullRequestApproval, { pullRequest: pullRequestRef }, { spaceId });
1222
+ setBusy(false);
1223
+ if (error) {
1224
+ log.warn("approve failed", { error }, {
1225
+ "~LogMeta": "~LogMeta",
1226
+ F: __dxlog_file,
1227
+ L: 248,
1228
+ S: void 0
1229
+ });
1230
+ await failureToast("approve", "approve-pull-request-error.title", error);
1231
+ return;
1232
+ }
1233
+ await toast("approve", data?.commented ? "approve-pull-request-commented.title" : "approve-pull-request-success.title", true);
1234
+ refreshStatus();
1235
+ }, [
1236
+ invokePromise,
1237
+ pullRequestRef,
1238
+ spaceId,
1239
+ toast,
1240
+ failureToast,
1241
+ refreshStatus
1242
+ ]);
1243
+ /** `force` is what makes the toolbar's entry a REgeneration: the same head would otherwise no-op. */
1244
+ const handleGenerate = useCallback(async () => {
1245
+ setTab("walkthrough");
1246
+ setGenerating(true);
1247
+ const { error } = await invokePromise(GitHubOperation.GenerateWalkthrough, {
1248
+ pullRequest: pullRequestRef,
1249
+ force: walkthrough !== void 0
1250
+ }, { spaceId });
1251
+ setGenerating(false);
1252
+ if (error) {
1253
+ log.warn("walkthrough generation failed", { error }, {
1254
+ "~LogMeta": "~LogMeta",
1255
+ F: __dxlog_file,
1256
+ L: 272,
1257
+ S: void 0
1258
+ });
1259
+ await failureToast("walkthrough", "walkthrough-failed.title", error);
1260
+ return;
1261
+ }
1262
+ await toast("walkthrough", "walkthrough-ready.title", true);
1263
+ }, [
1264
+ invokePromise,
1265
+ pullRequestRef,
1266
+ spaceId,
1267
+ walkthrough,
1268
+ toast,
1269
+ failureToast
1270
+ ]);
1271
+ const handleCopyLink = useCallback(async () => {
1272
+ if (!subject.url) return;
1273
+ try {
1274
+ await navigator.clipboard.writeText(subject.url);
1275
+ } catch (error) {
1276
+ log.warn("copy link failed", { error }, {
1277
+ "~LogMeta": "~LogMeta",
1278
+ F: __dxlog_file,
1279
+ L: 289,
1280
+ S: void 0
1281
+ });
1282
+ await toast("copy-link", "copy-link-error.title", false);
1283
+ return;
1284
+ }
1285
+ await toast("copy-link", "copy-link-success.title", true);
1286
+ }, [subject.url, toast]);
1287
+ const handleComment = useCallback(async () => {
1288
+ const text = comment.trim();
1289
+ if (!text) return;
1290
+ setBusy(true);
1291
+ const { error } = lineTarget ? await invokePromise(GitHubOperation.AddPullRequestReviewComment, {
1292
+ pullRequest: pullRequestRef,
1293
+ body: text,
1294
+ commit: lineTarget.commit,
1295
+ path: lineTarget.target.file,
1296
+ line: lineTarget.target.line,
1297
+ side: lineTarget.target.side === "before" ? "LEFT" : "RIGHT"
1298
+ }, { spaceId }) : await invokePromise(GitHubOperation.AddPullRequestComment, {
1299
+ pullRequest: pullRequestRef,
1300
+ body: text
1301
+ }, { spaceId });
1302
+ setBusy(false);
1303
+ if (error) {
1304
+ log.warn("comment failed", { error }, {
1305
+ "~LogMeta": "~LogMeta",
1306
+ F: __dxlog_file,
1307
+ L: 322,
1308
+ S: void 0
1309
+ });
1310
+ await failureToast("comment", "comment-error.title", error);
1311
+ return;
1312
+ }
1313
+ setComment("");
1314
+ handleCloseComposer();
1315
+ await toast("comment", "comment-success.title", true);
1316
+ }, [
1317
+ comment,
1318
+ lineTarget,
1319
+ invokePromise,
1320
+ pullRequestRef,
1321
+ spaceId,
1322
+ toast,
1323
+ failureToast,
1324
+ handleCloseComposer
1325
+ ]);
1326
+ const tabs = useMemo(() => /* @__PURE__ */ jsx(Tabs.List, { children: TABS.map((value) => /* @__PURE__ */ jsx(Tabs.Trigger, {
1327
+ value,
1328
+ "data-testid": `pull-request.tab.${value}`,
1329
+ children: t(`${value}-tab.label`)
1330
+ }, value)) }), [t]);
1331
+ const fileReviewed = file !== void 0 && files.reviewed.has(file.path);
1332
+ const menuActions = useMenuBuilder(() => {
1333
+ const builder = MenuBuilder.make().action("tabs", {
1334
+ variant: "custom",
1335
+ label: ["views.label", { ns: meta.profile.key }],
1336
+ render: () => tabs
1337
+ }, () => {}).separator();
1338
+ if (tab === "files") builder.action("previousFile", {
1339
+ label: ["previous-file.label", { ns: meta.profile.key }],
1340
+ icon: "ph--caret-up--regular",
1341
+ disabled: !file,
1342
+ disposition: "toolbar",
1343
+ testId: "pull-request.toolbar.previous-file"
1344
+ }, () => step(-1)).action("nextFile", {
1345
+ label: ["next-file.label", { ns: meta.profile.key }],
1346
+ icon: "ph--caret-down--regular",
1347
+ disabled: !file,
1348
+ disposition: "toolbar",
1349
+ testId: "pull-request.toolbar.next-file"
1350
+ }, () => step(1)).action("reviewed", {
1351
+ label: ["file-reviewed.label", { ns: meta.profile.key }],
1352
+ icon: fileReviewed ? "ph--check-square--fill" : "ph--square--regular",
1353
+ iconOnly: false,
1354
+ disabled: !file,
1355
+ disposition: "toolbar",
1356
+ testId: "pull-request.toolbar.reviewed"
1357
+ }, () => handleToggleReviewed()).separator("line");
1358
+ return builder.action("approve", {
1359
+ label: ["approve-pull-request.label", { ns: meta.profile.key }],
1360
+ icon: "ph--check-circle--regular",
1361
+ variant: "primary",
1362
+ iconOnly: false,
1363
+ disabled: busy || state === "merged" || state === "closed",
1364
+ disposition: "toolbar",
1365
+ testId: "pull-request.toolbar.approve"
1366
+ }, () => void handleApprove()).action("comment", {
1367
+ label: ["comment-pull-request.label", { ns: meta.profile.key }],
1368
+ icon: "ph--chat-text--regular",
1369
+ disabled: busy,
1370
+ disposition: "toolbar",
1371
+ testId: "pull-request.toolbar.comment"
1372
+ }, () => handleToggleComposer()).separator("line").action("generateWalkthrough", {
1373
+ label: [walkthrough ? "regenerate-walkthrough.label" : "generate-walkthrough.label", { ns: meta.profile.key }],
1374
+ icon: "ph--path--regular",
1375
+ disabled: generating,
1376
+ disposition: "toolbar",
1377
+ testId: "pull-request.toolbar.generate-walkthrough"
1378
+ }, () => void handleGenerate()).action("openOnGitHub", {
1379
+ label: ["open-on-github.label", { ns: meta.profile.key }],
1380
+ icon: "ph--arrow-square-out--regular",
1381
+ disabled: !subject.url,
1382
+ disposition: "toolbar",
1383
+ testId: "pull-request.toolbar.open-on-github"
1384
+ }, () => subject.url && window.open(subject.url, "_blank", "noopener,noreferrer")).action("copyLink", {
1385
+ label: ["copy-link.label", { ns: meta.profile.key }],
1386
+ icon: "ph--link--regular",
1387
+ disabled: !subject.url,
1388
+ disposition: "toolbar",
1389
+ testId: "pull-request.toolbar.copy-link"
1390
+ }, () => void handleCopyLink()).build();
1391
+ }, [
1392
+ tabs,
1393
+ tab,
1394
+ file,
1395
+ fileReviewed,
1396
+ step,
1397
+ handleToggleReviewed,
1398
+ busy,
1399
+ generating,
1400
+ walkthrough,
1401
+ subject.url,
1402
+ state,
1403
+ handleApprove,
1404
+ handleGenerate,
1405
+ handleCopyLink,
1406
+ handleToggleComposer
1407
+ ]);
1408
+ const details = useMemo(() => ({
1409
+ reference,
1410
+ state,
1411
+ checks: status ? `${t(ciLabel[status.ci])}${status.checks.total > 0 ? ` ${status.checks.passed}/${status.checks.total}` : ""}` : t("ci-status.unknown.label"),
1412
+ branches: subject.headBranch && (subject.baseBranch ? `${subject.headBranch} → ${subject.baseBranch}` : subject.headBranch)
1413
+ }), [
1414
+ reference,
1415
+ state,
1416
+ status,
1417
+ subject.headBranch,
1418
+ subject.baseBranch,
1419
+ t
1420
+ ]);
1421
+ const composerProps = {
1422
+ value: comment,
1423
+ busy,
1424
+ onValueChange: setComment,
1425
+ onSubmit: () => void handleComment(),
1426
+ onCancel: handleCloseComposer
1427
+ };
1428
+ return /* @__PURE__ */ jsx(Tabs.Root, {
1429
+ asChild: true,
1430
+ orientation: "horizontal",
1431
+ value: tab,
1432
+ onValueChange: (value) => setTab(TABS.find((candidate) => candidate === value) ?? "overview"),
1433
+ children: /* @__PURE__ */ jsxs(Panel.Root, {
1434
+ role,
1435
+ children: [
1436
+ /* @__PURE__ */ jsx(Panel.Header, { children: /* @__PURE__ */ jsx(ActionToolbar, {
1437
+ ...menuActions,
1438
+ attendableId,
1439
+ alwaysActive: true
1440
+ }) }),
1441
+ /* @__PURE__ */ jsx(Panel.Body, {
1442
+ asChild: true,
1443
+ children: /* @__PURE__ */ jsxs(Layout.Flex, {
1444
+ column: true,
1445
+ children: [
1446
+ /* @__PURE__ */ jsx(PullRequestStatus, {
1447
+ reference,
1448
+ title: subject.title,
1449
+ state,
1450
+ review: status && {
1451
+ state: status.review,
1452
+ approvals: status.approvals
1453
+ },
1454
+ ci: status && {
1455
+ state: status.ci,
1456
+ checks: status.checks
1457
+ }
1458
+ }),
1459
+ composing && !lineTarget && /* @__PURE__ */ jsx(CommentBand, { ...composerProps }),
1460
+ /* @__PURE__ */ jsx(LineCommentPopover, {
1461
+ ...composerProps,
1462
+ open: composing && !!lineTarget,
1463
+ anchorRef: lineAnchorRef,
1464
+ target: lineTarget?.target
1465
+ }),
1466
+ tab === "overview" && /* @__PURE__ */ jsx(PullRequestOverview, {
1467
+ body: status?.body ?? subject.description,
1468
+ details,
1469
+ runs: status?.runs
1470
+ }),
1471
+ tab === "walkthrough" && (walkthrough ? /* @__PURE__ */ jsx(WalkthroughView, {
1472
+ value: walkthrough.body,
1473
+ sidebar: "full",
1474
+ onLineComment: handleWalkthroughLineComment
1475
+ }) : /* @__PURE__ */ jsx(WalkthroughPlaceholder, {
1476
+ generating,
1477
+ onGenerate: () => void handleGenerate()
1478
+ })),
1479
+ tab === "files" && /* @__PURE__ */ jsx(PullRequestFiles, {
1480
+ tree: files.tree,
1481
+ file,
1482
+ reviewed: files.reviewed,
1483
+ total: files.files.length,
1484
+ error: diff.error && t("files-error.message"),
1485
+ onSelect: files.select,
1486
+ onReviewedChange: setReviewed,
1487
+ onLineComment: diff.commit ? handleFilesLineComment : void 0
1488
+ })
1489
+ ]
1490
+ })
1491
+ }),
1492
+ /* @__PURE__ */ jsx(Panel.Footer, {
1493
+ classNames: "border-t border-separator-subtle",
1494
+ children: /* @__PURE__ */ jsx(ProgressMeter, {
1495
+ state: walkthroughProgress?.status === "running" || walkthroughProgress?.status === "error" ? walkthroughProgress : void 0,
1496
+ onCancel: progressRegistry && walkthroughProgress ? () => progressRegistry.cancel(walkthroughProgress.name) : void 0
1497
+ })
1498
+ })
1499
+ ]
1500
+ })
1501
+ });
1502
+ };
1503
+ //#endregion
1504
+ export { PullRequestArticle as t };
1505
+
1506
+ //# sourceMappingURL=chunk-PullRequestArticle.mjs.map