feat(integrations): add Bitbucket Cloud (#6860)

* feat(integrations): add Bitbucket Cloud

* fix(bitbucket): enforce selector workspace slugs

* fix(bitbucket): overfetch small pipeline log tails

* fix(bitbucket): harden provider edge cases

* fix(bitbucket): accept provider diff redirect specs

* fix(bitbucket): stop advanced-field leakage and harden log, status, and selector paths

Splits the `closeSourceBranch` advanced subBlock into per-operation ids. Advanced
fields serialize without evaluating their condition, so a value set on Create Pull
Request reached Merge Pull Request and closed the source branch unprompted.

Also:
- read step logs through the byte-capped server transport and map an empty-log 416
  to an empty result, keeping a genuine 416 an error
- trim a step log's partial leading line after the character cap rather than before,
  and never return an empty log when the retained window held content
- surface Bitbucket's `error.detail` alongside `error.message`
- treat commit-status `key`/`state` as nullable so one malformed row cannot drop a page
- match repository `full_name` case-insensitively and reject dot segments in a
  workspace slug before the outbound request
- type `reviewerAccountIds` as the comma-separated string it is
- trim optional Bitbucket query strings; correct the token lifetime to two hours

---------

Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
Co-authored-by: Waleed Latif <walif6@gmail.com>
This commit is contained in:
Bill Leoutsakos
2026-08-19 20:32:44 -07:00
committed by GitHub
co-authored by Bill Leoutsakos Waleed Latif
parent 9f346765fe
commit e3a4874ece
81 changed files with 13285 additions and 8 deletions
+32
View File
@@ -754,6 +754,38 @@ export function GithubOutlineIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function BitbucketIcon(props: SVGProps<SVGSVGElement>) {
const id = useId()
const gradientId = `bitbucket_original_a_${id}`
return (
<svg {...props} viewBox='0 0 128 128' xmlns='http://www.w3.org/2000/svg'>
<defs>
<linearGradient
id={gradientId}
gradientUnits='userSpaceOnUse'
x1='28.593'
y1='14.226'
x2='16.672'
y2='23.532'
gradientTransform='scale(4)'
>
<stop offset='.176' stopColor='#0052cc' />
<stop offset='1' stopColor='#2684ff' />
</linearGradient>
</defs>
<path
d='M19.082 20c-1.918 0-3.355 1.758-3.039 3.516l12.95 79.289c.32 2.078 2.077 3.515 4.155 3.515h62.66c1.442 0 2.72-1.12 3.04-2.558l13.109-80.086c.316-1.918-1.121-3.516-3.039-3.516zM74.07 77.227H54.09l-5.278-28.293h30.215zm0 0'
fill='#2684ff'
/>
<path
d='M107.64 48.934H78.868L74.07 77.227H54.09l-23.5 27.972s1.12.961 2.719.961h62.66c1.441 0 2.719-1.12 3.039-2.558zm0 0'
fill={`url(#${gradientId})`}
/>
</svg>
)
}
export function GitLabIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'>
+2
View File
@@ -24,6 +24,7 @@ import {
AttioIcon,
AzureDataExplorerIcon,
AzureIcon,
BitbucketIcon,
BoxCompanyIcon,
BrainIcon,
BrandfetchIcon,
@@ -288,6 +289,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
attio: AttioIcon,
azure_data_explorer: AzureDataExplorerIcon,
azure_devops: AzureIcon,
bitbucket: BitbucketIcon,
box: BoxCompanyIcon,
brandfetch: BrandfetchIcon,
brex: BrexIcon,