Skip to content

Commit b1ef501

Browse files
committed
Merge remote-tracking branch 'origin/dev' into dev
2 parents 9fb12a9 + fafbc29 commit b1ef501

130 files changed

Lines changed: 1514 additions & 989 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/setup-bun/action.yml

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@ description: "Setup Bun with caching and install dependencies"
33
runs:
44
using: "composite"
55
steps:
6-
- name: Cache Bun dependencies
7-
uses: actions/cache@v4
8-
with:
9-
path: ~/.bun/install/cache
10-
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }}
11-
restore-keys: |
12-
${{ runner.os }}-bun-
13-
146
- name: Get baseline download URL
157
id: bun-url
168
shell: bash
@@ -31,6 +23,19 @@ runs:
3123
bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }}
3224
bun-download-url: ${{ steps.bun-url.outputs.url }}
3325

26+
- name: Get cache directory
27+
id: cache
28+
shell: bash
29+
run: echo "dir=$(bun pm cache)" >> "$GITHUB_OUTPUT"
30+
31+
- name: Cache Bun dependencies
32+
uses: actions/cache@v4
33+
with:
34+
path: ${{ steps.cache.outputs.dir }}
35+
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
36+
restore-keys: |
37+
${{ runner.os }}-bun-
38+
3439
- name: Install setuptools for distutils compatibility
3540
run: python3 -m pip install setuptools || pip install setuptools || true
3641
shell: bash

.github/workflows/publish.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ jobs:
115115
target: x86_64-apple-darwin
116116
- host: macos-latest
117117
target: aarch64-apple-darwin
118+
# github-hosted: blacksmith lacks ARM64 MSVC cross-compilation toolchain
119+
- host: windows-2025
120+
target: aarch64-pc-windows-msvc
118121
- host: blacksmith-4vcpu-windows-2025
119122
target: x86_64-pc-windows-msvc
120123
- host: blacksmith-4vcpu-ubuntu-2404
@@ -258,6 +261,10 @@ jobs:
258261
- host: macos-latest
259262
target: aarch64-apple-darwin
260263
platform_flag: --mac --arm64
264+
# github-hosted: blacksmith lacks ARM64 MSVC cross-compilation toolchain
265+
- host: "windows-2025"
266+
target: aarch64-pc-windows-msvc
267+
platform_flag: --win --arm64
261268
- host: "blacksmith-4vcpu-windows-2025"
262269
target: x86_64-pc-windows-msvc
263270
platform_flag: --win

bun.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

infra/console.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ export const stripeWebhook = new stripe.WebhookEndpoint("StripeWebhookEndpoint",
103103
const zenLiteProduct = new stripe.Product("ZenLite", {
104104
name: "OpenCode Go",
105105
})
106+
const zenLiteCouponFirstMonth50 = new stripe.Coupon("ZenLiteCouponFirstMonth50", {
107+
name: "First month 50% off",
108+
percentOff: 50,
109+
appliesToProducts: [zenLiteProduct.id],
110+
duration: "once",
111+
})
106112
const zenLitePrice = new stripe.Price("ZenLitePrice", {
107113
product: zenLiteProduct.id,
108114
currency: "usd",
@@ -116,6 +122,7 @@ const ZEN_LITE_PRICE = new sst.Linkable("ZEN_LITE_PRICE", {
116122
properties: {
117123
product: zenLiteProduct.id,
118124
price: zenLitePrice.id,
125+
firstMonth50Coupon: zenLiteCouponFirstMonth50.id,
119126
},
120127
})
121128

packages/app/e2e/prompt/prompt-slash-terminal.spec.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,29 @@ test("/terminal toggles the terminal panel", async ({ page, gotoSession }) => {
66

77
const prompt = page.locator(promptSelector)
88
const terminal = page.locator(terminalSelector)
9+
const slash = page.locator('[data-slash-id="terminal.toggle"]').first()
910

1011
await expect(terminal).not.toBeVisible()
1112

1213
await prompt.fill("/terminal")
13-
await expect(page.locator('[data-slash-id="terminal.toggle"]').first()).toBeVisible()
14+
await expect(slash).toBeVisible()
1415
await page.keyboard.press("Enter")
1516
await expect(terminal).toBeVisible()
1617

17-
await prompt.fill("/terminal")
18-
await expect(page.locator('[data-slash-id="terminal.toggle"]').first()).toBeVisible()
18+
// Terminal panel retries focus (immediate, RAF, 120ms, 240ms) after opening,
19+
// which can steal focus from the prompt and prevent fill() from triggering
20+
// the slash popover. Re-attempt click+fill until all retries are exhausted
21+
// and the popover appears.
22+
await expect
23+
.poll(
24+
async () => {
25+
await prompt.click().catch(() => false)
26+
await prompt.fill("/terminal").catch(() => false)
27+
return slash.isVisible().catch(() => false)
28+
},
29+
{ timeout: 10_000 },
30+
)
31+
.toBe(true)
1932
await page.keyboard.press("Enter")
2033
await expect(terminal).not.toBeVisible()
2134
})

packages/console/app/src/component/header.tsx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,12 @@ export function Header(props: { zen?: boolean; go?: boolean; hideGetStarted?: bo
161161
<li>
162162
<a href={language.route("/docs")}>{i18n.t("nav.docs")}</a>
163163
</li>
164-
<Show when={!props.zen}>
165-
<li>
166-
<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>
167-
</li>
168-
</Show>
169-
<Show when={!props.go}>
170-
<li>
171-
<A href={language.route("/go")}>{i18n.t("nav.go")}</A>
172-
</li>
173-
</Show>
164+
<li>
165+
<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>
166+
</li>
167+
<li>
168+
<A href={language.route("/go")}>{i18n.t("nav.go")}</A>
169+
</li>
174170
<li>
175171
<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>
176172
</li>

packages/console/app/src/component/icon.tsx

Lines changed: 28 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,25 @@
11
import { JSX } from "solid-js"
22

3-
export function IconLogo(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
3+
export function IconZen(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
44
return (
5-
<svg width="64" height="32" viewBox="0 0 64 32" fill="none" xmlns="http://www.w3.org/2000/svg">
6-
<path d="M0 9.14333V4.5719H4.57143V9.14333H0Z" fill="currentColor" />
7-
<path d="M4.57178 9.14333V4.5719H9.14321V9.14333H4.57178Z" fill="currentColor" />
8-
<path d="M9.1438 9.14333V4.5719H13.7152V9.14333H9.1438Z" fill="currentColor" />
9-
<path d="M13.7124 9.14333V4.5719H18.2838V9.14333H13.7124Z" fill="currentColor" />
10-
<path d="M13.7124 13.7136V9.14221H18.2838V13.7136H13.7124Z" fill="currentColor" />
11-
<path d="M0 18.2857V13.7142H4.57143V18.2857H0Z" fill="currentColor" fill-opacity="0.2" />
12-
<rect width="4.57143" height="4.57143" transform="translate(4.57178 13.7141)" fill="currentColor" />
13-
<path d="M4.57178 18.2855V13.7141H9.14321V18.2855H4.57178Z" fill="currentColor" fill-opacity="0.2" />
14-
<path d="M9.1438 18.2855V13.7141H13.7152V18.2855H9.1438Z" fill="currentColor" />
15-
<path d="M13.7156 18.2855V13.7141H18.287V18.2855H13.7156Z" fill="currentColor" fill-opacity="0.2" />
16-
<rect width="4.57143" height="4.57143" transform="translate(0 18.2859)" fill="currentColor" />
17-
<path d="M0 22.8572V18.2858H4.57143V22.8572H0Z" fill="currentColor" fill-opacity="0.2" />
18-
<rect
19-
width="4.57143"
20-
height="4.57143"
21-
transform="translate(4.57178 18.2859)"
22-
fill="currentColor"
23-
fill-opacity="0.2"
24-
/>
25-
<path d="M4.57178 22.8573V18.2859H9.14321V22.8573H4.57178Z" fill="currentColor" />
26-
<path d="M9.1438 22.8573V18.2859H13.7152V22.8573H9.1438Z" fill="currentColor" fill-opacity="0.2" />
27-
<path d="M13.7156 22.8573V18.2859H18.287V22.8573H13.7156Z" fill="currentColor" fill-opacity="0.2" />
28-
<path d="M0 27.4292V22.8578H4.57143V27.4292H0Z" fill="currentColor" />
29-
<path d="M4.57178 27.4292V22.8578H9.14321V27.4292H4.57178Z" fill="currentColor" />
30-
<path d="M9.1438 27.4276V22.8562H13.7152V27.4276H9.1438Z" fill="currentColor" />
31-
<path d="M13.7124 27.4292V22.8578H18.2838V27.4292H13.7124Z" fill="currentColor" />
32-
<path d="M22.8572 9.14333V4.5719H27.4286V9.14333H22.8572Z" fill="currentColor" />
33-
<path d="M27.426 9.14333V4.5719H31.9975V9.14333H27.426Z" fill="currentColor" />
34-
<path d="M32.001 9.14333V4.5719H36.5724V9.14333H32.001Z" fill="currentColor" />
35-
<path d="M36.5698 9.14333V4.5719H41.1413V9.14333H36.5698Z" fill="currentColor" />
36-
<path d="M22.8572 13.7152V9.1438H27.4286V13.7152H22.8572Z" fill="currentColor" />
37-
<path d="M36.5698 13.7152V9.1438H41.1413V13.7152H36.5698Z" fill="currentColor" />
38-
<path d="M22.8572 18.2855V13.7141H27.4286V18.2855H22.8572Z" fill="currentColor" />
39-
<path d="M27.4292 18.2855V13.7141H32.0006V18.2855H27.4292Z" fill="currentColor" />
40-
<path d="M32.001 18.2855V13.7141H36.5724V18.2855H32.001Z" fill="currentColor" />
41-
<path d="M36.5698 18.2855V13.7141H41.1413V18.2855H36.5698Z" fill="currentColor" />
42-
<path d="M22.8572 22.8573V18.2859H27.4286V22.8573H22.8572Z" fill="currentColor" />
43-
<path d="M27.4292 22.8573V18.2859H32.0006V22.8573H27.4292Z" fill="currentColor" fill-opacity="0.2" />
44-
<path d="M32.001 22.8573V18.2859H36.5724V22.8573H32.001Z" fill="currentColor" fill-opacity="0.2" />
45-
<path d="M36.5698 22.8573V18.2859H41.1413V22.8573H36.5698Z" fill="currentColor" fill-opacity="0.2" />
46-
<path d="M22.8572 27.4292V22.8578H27.4286V27.4292H22.8572Z" fill="currentColor" />
47-
<path d="M27.4292 27.4276V22.8562H32.0006V27.4276H27.4292Z" fill="currentColor" />
48-
<path d="M32.001 27.4276V22.8562H36.5724V27.4276H32.001Z" fill="currentColor" />
49-
<path d="M36.5698 27.4292V22.8578H41.1413V27.4292H36.5698Z" fill="currentColor" />
50-
<path d="M45.7144 9.14333V4.5719H50.2858V9.14333H45.7144Z" fill="currentColor" />
51-
<path d="M50.2861 9.14333V4.5719H54.8576V9.14333H50.2861Z" fill="currentColor" />
52-
<path d="M54.855 9.14333V4.5719H59.4264V9.14333H54.855Z" fill="currentColor" />
53-
<path d="M45.7144 13.7136V9.14221H50.2858V13.7136H45.7144Z" fill="currentColor" />
54-
<path d="M59.4299 13.7152V9.1438H64.0014V13.7152H59.4299Z" fill="currentColor" />
55-
<path d="M45.7144 18.2855V13.7141H50.2858V18.2855H45.7144Z" fill="currentColor" />
56-
<path d="M50.2861 18.2857V13.7142H54.8576V18.2857H50.2861Z" fill="currentColor" fill-opacity="0.2" />
57-
<path d="M54.8579 18.2855V13.7141H59.4293V18.2855H54.8579Z" fill="currentColor" fill-opacity="0.2" />
58-
<path d="M59.4299 18.2855V13.7141H64.0014V18.2855H59.4299Z" fill="currentColor" />
59-
<path d="M45.7144 22.8573V18.2859H50.2858V22.8573H45.7144Z" fill="currentColor" />
60-
<path d="M50.2861 22.8572V18.2858H54.8576V22.8572H50.2861Z" fill="currentColor" fill-opacity="0.2" />
61-
<path d="M54.8579 22.8573V18.2859H59.4293V22.8573H54.8579Z" fill="currentColor" fill-opacity="0.2" />
62-
<path d="M59.4299 22.8573V18.2859H64.0014V22.8573H59.4299Z" fill="currentColor" />
63-
<path d="M45.7144 27.4292V22.8578H50.2858V27.4292H45.7144Z" fill="currentColor" />
64-
<path d="M50.2861 27.4286V22.8572H54.8576V27.4286H50.2861Z" fill="currentColor" fill-opacity="0.2" />
65-
<path d="M54.8579 27.4285V22.8571H59.4293V27.4285H54.8579Z" fill="currentColor" fill-opacity="0.2" />
66-
<path d="M59.4299 27.4292V22.8578H64.0014V27.4292H59.4299Z" fill="currentColor" />
5+
<svg width="84" height="30" viewBox="0 0 84 30" fill="none" xmlns="http://www.w3.org/2000/svg">
6+
<path d="M24 24H6V18H18V12H24V24ZM6 18H0V12H6V18Z" fill="currentColor" fill-opacity="0.2" />
7+
<path d="M6 24H24V30H0V18H6V24ZM18 18H6V12H18V18ZM24 12H18V6H0V0H24V12Z" fill="currentColor" />
8+
<path d="M54 18V24H36V18H54Z" fill="currentColor" fill-opacity="0.2" />
9+
<path d="M54 18H36V24H54V30H30V0H54V18ZM36 12H48V6H36V12Z" fill="currentColor" />
10+
<path d="M78 30H66V12H78V30Z" fill="currentColor" fill-opacity="0.2" />
11+
<path d="M78 6H66V30H60V0H78V6ZM84 30H78V6H84V30Z" fill="currentColor" />
12+
</svg>
13+
)
14+
}
15+
16+
export function IconGo(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
17+
return (
18+
<svg width="54" height="30" viewBox="0 0 54 30" fill="none" xmlns="http://www.w3.org/2000/svg">
19+
<path d="M24 30H0V0H24V6H6V24H18V18H12V12H24V30Z" fill="currentColor" />
20+
<path d="M12 18H18V24H6V12H12V18Z" fill="currentColor" fill-opacity="0.2" />
21+
<path d="M48 12V24H36V12H48Z" fill="currentColor" fill-opacity="0.2" />
22+
<path d="M54 30H30V0H54V30ZM36 24H48V6H36V24Z" fill="currentColor" />
6723
</svg>
6824
)
6925
}
@@ -111,6 +67,15 @@ export function IconStripe(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
11167
)
11268
}
11369

70+
export function IconAlipay(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
71+
return (
72+
<svg {...props} viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
73+
<path d="M2.541 0H13.5a2.55 2.55 0 0 1 2.54 2.563v8.297c-.006 0-.531-.046-2.978-.813-.412-.14-.916-.327-1.479-.536q-.456-.17-.957-.353a13 13 0 0 0 1.325-3.373H8.822V4.649h3.831v-.634h-3.83V2.121H7.26c-.274 0-.274.273-.274.273v1.621H3.11v.634h3.875v1.136h-3.2v.634H9.99c-.227.789-.532 1.53-.894 2.202-2.013-.67-4.161-1.212-5.51-.878-.864.214-1.42.597-1.746.998-1.499 1.84-.424 4.633 2.741 4.633 1.872 0 3.675-1.053 5.072-2.787 2.08 1.008 6.37 2.738 6.387 2.745v.105A2.55 2.55 0 0 1 13.5 16H2.541A2.55 2.55 0 0 1 0 13.437V2.563A2.55 2.55 0 0 1 2.541 0" />
74+
<path d="M2.309 9.27c-1.22 1.073-.49 3.034 1.978 3.034 1.434 0 2.868-.925 3.994-2.406-1.602-.789-2.959-1.353-4.425-1.207-.397.04-1.14.217-1.547.58Z" />
75+
</svg>
76+
)
77+
}
78+
11479
export function IconChevron(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
11580
return (
11681
<svg {...props} width="8" height="6" viewBox="0 0 8 6" fill="none" xmlns="http://www.w3.org/2000/svg">

0 commit comments

Comments
 (0)