Skip to content

Commit 70aca2c

Browse files
committed
Merge remote-tracking branch 'upstream/main' into bob/peer-ssh-workspace-isolation
2 parents 5dae819 + 175d3bf commit 70aca2c

56 files changed

Lines changed: 2223 additions & 6539 deletions

Some content is hidden

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

‎.github/workflows/desktop-package.yml‎

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -757,19 +757,17 @@ jobs:
757757
run: |
758758
set -euo pipefail
759759
shopt -s globstar
760+
# AppImage, deb, and rpm files are already copied into the
761+
# canonical release-updater-assets directory above. Publishing the
762+
# raw Tauri bundle names as well creates a second public copy of
763+
# every Linux installer and doubles the signature count.
760764
node scripts/stage-github-release-assets.mjs \
761765
--out-dir release-upload-assets \
762766
release-updater-assets/* \
763767
release-manual-assets/*.exe \
764768
release-manual-assets/*.exe.sig \
765-
release-assets/**/*.AppImage \
766-
release-assets/**/*.AppImage.sig \
767-
release-assets/**/*.deb \
768-
release-assets/**/*.deb.sig \
769769
release-assets/**/*.dmg \
770770
release-assets/**/*.dmg.sig \
771-
release-assets/**/*.rpm \
772-
release-assets/**/*.rpm.sig \
773771
release-assets/minisign.pub \
774772
linux-release-assets/openbitfun-cli-*.tar.gz \
775773
linux-release-assets/openbitfun-cli-*.tar.gz.sha256 \
@@ -827,9 +825,25 @@ jobs:
827825
esac
828826
gh release upload "${RELEASE_TAG}" --repo "${GITHUB_REPOSITORY}" \
829827
--clobber release-upload-assets/*
828+
MOBILE_VERSION="$(sed -nE 's/.*versionName = "([^"]+)".*/\1/p' \
829+
src/apps/mobile/android/app/build.gradle.kts 2>/dev/null | head -n1 || true)"
830+
MOBILE_VERSION="${MOBILE_VERSION:-$RELEASE_VERSION}"
831+
gh release view "${RELEASE_TAG}" --repo "${GITHUB_REPOSITORY}" \
832+
--json body --jq .body > release-notes.md
833+
if ! grep -q '<!-- openbitfun-mobile-release -->' release-notes.md; then
834+
cat >> release-notes.md <<EOF
835+
836+
<!-- openbitfun-mobile-release -->
837+
### Android mobile
838+
839+
Android mobile version **${MOBILE_VERSION}** is published separately as a prerelease:
840+
[Download the Android prerelease](https://github.com/${GITHUB_REPOSITORY}/releases/tag/mobile-v${MOBILE_VERSION}).
841+
The current APK uses the runner-generated debug signing key.
842+
EOF
843+
fi
830844
gh release edit "${RELEASE_TAG}" --repo "${GITHUB_REPOSITORY}" \
831-
--title "OpenBitFun ${RELEASE_VERSION}" --draft=false \
832-
--prerelease="${RELEASE_PRERELEASE}" --latest="${RELEASE_LATEST}"
845+
--title "OpenBitFun ${RELEASE_VERSION}" --notes-file release-notes.md \
846+
--draft=false --prerelease="${RELEASE_PRERELEASE}" --latest="${RELEASE_LATEST}"
833847
834848
- name: Verify published legacy update feeds
835849
if: needs.prepare.outputs.release_channel == 'stable'
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
name: Mobile Package
2+
3+
on:
4+
push:
5+
tags:
6+
- 'mobile-v*'
7+
workflow_dispatch:
8+
inputs:
9+
tag_name:
10+
description: 'Mobile release tag (for example mobile-v1.0.0).'
11+
required: true
12+
type: string
13+
14+
permissions:
15+
contents: write
16+
17+
concurrency:
18+
group: mobile-package-${{ github.event.release.tag_name || inputs.tag_name || github.ref_name }}
19+
cancel-in-progress: false
20+
21+
jobs:
22+
prepare:
23+
name: Prepare mobile release
24+
runs-on: ubuntu-latest
25+
outputs:
26+
tag_name: ${{ steps.meta.outputs.tag_name }}
27+
version: ${{ steps.meta.outputs.version }}
28+
prerelease: ${{ steps.meta.outputs.prerelease }}
29+
steps:
30+
- uses: actions/checkout@v5
31+
with:
32+
ref: ${{ inputs.tag_name || github.ref_name }}
33+
fetch-depth: 1
34+
35+
- name: Resolve mobile version
36+
id: meta
37+
shell: bash
38+
env:
39+
INPUT_TAG_NAME: ${{ inputs.tag_name }}
40+
REF_NAME: ${{ github.ref_name }}
41+
run: |
42+
set -euo pipefail
43+
TAG="${INPUT_TAG_NAME:-${REF_NAME}}"
44+
case "$TAG" in
45+
mobile-v*) ;;
46+
*) echo "Expected a mobile-v* tag, got $TAG" >&2; exit 1 ;;
47+
esac
48+
VERSION="${TAG#mobile-v}"
49+
node scripts/verify-release-version-sync.mjs --mobile-version "$VERSION"
50+
if [[ "$VERSION" == *-* ]]; then
51+
PRERELEASE=true
52+
else
53+
PRERELEASE=false
54+
fi
55+
printf 'tag_name=%s\nversion=%s\nprerelease=%s\n' \
56+
"$TAG" "$VERSION" "$PRERELEASE" >> "$GITHUB_OUTPUT"
57+
58+
android:
59+
name: Android package
60+
needs: prepare
61+
runs-on: ubuntu-latest
62+
steps:
63+
- uses: actions/checkout@v5
64+
with:
65+
ref: ${{ needs.prepare.outputs.tag_name }}
66+
67+
- uses: actions/setup-java@v5
68+
with:
69+
distribution: temurin
70+
java-version: '21'
71+
72+
- uses: gradle/actions/setup-gradle@v4
73+
74+
- name: Configure Android release signing
75+
shell: bash
76+
run: |
77+
set -euo pipefail
78+
echo "Using the runner-generated Android debug keystore for this mobile prerelease."
79+
80+
- name: Build signed Android package
81+
working-directory: src/apps/mobile/android
82+
run: ./gradlew :app:assembleRelease --no-daemon
83+
84+
- name: Stage Android release assets
85+
shell: bash
86+
env:
87+
VERSION: ${{ needs.prepare.outputs.version }}
88+
run: |
89+
set -euo pipefail
90+
mkdir -p mobile-release-assets
91+
suffix='-debug'
92+
cp src/apps/mobile/android/app/build/outputs/apk/release/app-release.apk \
93+
"mobile-release-assets/OpenBitFun-Mobile-${VERSION}-android${suffix}.apk"
94+
(cd mobile-release-assets && sha256sum ./*.apk > SHA256SUMS)
95+
96+
- uses: actions/upload-artifact@v6
97+
with:
98+
name: openbitfun-mobile-${{ needs.prepare.outputs.tag_name }}-android
99+
path: mobile-release-assets/*
100+
if-no-files-found: error
101+
retention-days: 7
102+
103+
publish:
104+
name: Publish mobile release
105+
needs: [prepare, android]
106+
runs-on: ubuntu-latest
107+
steps:
108+
- uses: actions/checkout@v5
109+
with:
110+
ref: ${{ needs.prepare.outputs.tag_name }}
111+
112+
- uses: actions/download-artifact@v7
113+
with:
114+
name: openbitfun-mobile-${{ needs.prepare.outputs.tag_name }}-android
115+
path: mobile-release-assets
116+
117+
- name: Create mobile release
118+
env:
119+
GH_TOKEN: ${{ github.token }}
120+
TAG_NAME: ${{ needs.prepare.outputs.tag_name }}
121+
VERSION: ${{ needs.prepare.outputs.version }}
122+
PRERELEASE: true
123+
shell: bash
124+
run: |
125+
set -euo pipefail
126+
VERSION="$VERSION (debug signing)"
127+
gh release create "$TAG_NAME" \
128+
--repo "$GITHUB_REPOSITORY" \
129+
--verify-tag \
130+
--title "OpenBitFun Mobile $VERSION" \
131+
--generate-notes \
132+
--prerelease="$PRERELEASE" \
133+
mobile-release-assets/*

‎AGENTS-CN.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Stable Contracts and Security Control Plane 的边界以
2828
| 2 | 产品组装层 | `src/crates/assembly` | 兼容导出、产品能力选择、product-full 接线、不可变内置 Agent 内容、adapter/service 注册和生态无关的来源协调 | `agent-content`, `core`, `external-sources`, `product-capabilities` | [AGENTS.md](src/crates/assembly/AGENTS.md) |
2929
| 3 | 适配层 | `src/crates/adapters` | AI/transport/WebDriver 协议 adapter、外部 AI work source adapter(OpenCode/Claude Code/Codex)和外部 provider 转换 | `agent-runtime-ipc`、`ai-adapters`, `opencode-adapter`, `claude-code-adapter`, `codex-adapter`, `static-hook-support`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
3030
| 4 | 服务实现层 | `src/crates/services` | 可复用 OS、filesystem、terminal、MCP、remote、git、watch、process、session persistence primitives、network 和 MiniApp runtime IO 实现 | `services-core`, `services-integrations`, `relay-service`, `page-function-runtime`, `terminal` | [AGENTS.md](src/crates/services/AGENTS.md) |
31-
| 5 | 执行原语层 | `src/crates/execution` | 可移植 Agent Runtime、命名工作流策略、stream、插件运行时客户端、typed-service、tool-contract、tool-group 和 tool-execution 构件 | `agent-runtime`, `agent-workflows`, `agent-stream`, `tool-contracts`, `plugin-runtime-client`, `runtime-services`, `tool-provider-groups`, `tool-execution`, `tool-call-jsonrepair` | [AGENTS.md](src/crates/execution/AGENTS.md) |
31+
| 5 | 执行原语层 | `src/crates/execution` | 可移植 Agent Runtime、命名工作流策略、stream、插件运行时客户端、typed-service、tool-contract、tool-group 和 tool-execution 构件 | `agent-runtime`, `agent-workflows`, `agent-stream`, `tool-contracts`, `plugin-runtime-client`, `runtime-services`, `tool-provider-groups`, `tool-execution` | [AGENTS.md](src/crates/execution/AGENTS.md) |
3232
| 6 | 稳定契约与产品领域层 | `src/crates/contracts` | 跨层共享 DTO、事件形状、runtime port、产品领域契约和策略 | `core-types`, `events`, `runtime-ports`, `product-domains` | [AGENTS.md](src/crates/contracts/AGENTS.md) |
3333

3434
边界规则:

‎AGENTS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Keep crate dependencies inside each layer to the smallest set needed.
4343
| 2 | Product assembly | `src/crates/assembly` | Compatibility exports, product capability selection, product-full wiring, immutable built-in Agent content, adapter/service registration, and ecosystem-neutral source coordination | `agent-content`, `core`, `external-sources`, `product-capabilities` | [AGENTS.md](src/crates/assembly/AGENTS.md) |
4444
| 3 | Adapters | `src/crates/adapters` | AI/transport/WebDriver protocol adapters, external AI work source adapters (OpenCode/Claude Code/Codex), and external-provider translation | `agent-runtime-ipc`, `ai-adapters`, `opencode-adapter`, `claude-code-adapter`, `codex-adapter`, `static-hook-support`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
4545
| 4 | Services | `src/crates/services` | Reusable OS, filesystem, terminal, MCP, remote, git, watch, process, session persistence primitives, MiniApp runtime IO, and network implementations | `services-core`, `services-integrations`, `miniapp-market-service`, `relay-service`, `page-function-runtime`, `terminal` | [AGENTS.md](src/crates/services/AGENTS.md) |
46-
| 5 | Execution primitives | `src/crates/execution` | Portable Agent Runtime, named-workflow policy, stream, plugin runtime client, typed-service, tool-contract, tool-group, and tool-execution building blocks | `agent-runtime`, `agent-workflows`, `agent-stream`, `tool-contracts`, `plugin-runtime-client`, `runtime-services`, `tool-provider-groups`, `tool-execution`, `tool-call-jsonrepair` | [AGENTS.md](src/crates/execution/AGENTS.md) |
46+
| 5 | Execution primitives | `src/crates/execution` | Portable Agent Runtime, named-workflow policy, stream, plugin runtime client, typed-service, tool-contract, tool-group, and tool-execution building blocks | `agent-runtime`, `agent-workflows`, `agent-stream`, `tool-contracts`, `plugin-runtime-client`, `runtime-services`, `tool-provider-groups`, `tool-execution` | [AGENTS.md](src/crates/execution/AGENTS.md) |
4747
| 6 | Stable contracts and product domains | `src/crates/contracts` | Shared DTOs, event shapes, runtime ports, and product domain contracts/policies | `core-types`, `events`, `runtime-ports`, `product-domains` | [AGENTS.md](src/crates/contracts/AGENTS.md) |
4848

4949
Boundary rules:

‎Cargo.lock‎

Lines changed: 7 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ members = [
4141
"src/crates/execution/agent-runtime",
4242
"src/crates/execution/agent-workflows",
4343
"src/crates/execution/agent-stream",
44-
"src/crates/execution/tool-call-jsonrepair",
4544
"src/crates/execution/tool-contracts",
4645
"src/crates/execution/plugin-runtime-client",
4746
"src/crates/execution/runtime-services",
@@ -97,6 +96,7 @@ futures-util = "0.3.31"
9796
# Serialization
9897
serde = { version = "1.0", features = ["derive"] }
9998
serde_json = "1.0"
99+
jsonrepair-rs = { version = "0.2.6", default-features = false }
100100
serde_yaml = "0.9"
101101

102102
# Document conversion

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ OpenBitFun is a highly customizable, open-source agent workspace that keeps work
1212

1313
**If this is the kind of agent workspace you want, ⭐ Star OpenBitFun and help more people discover it.**
1414

15-
[Download](https://openbitfun.com/download) · [Mini App Marketplace](https://market.openbitfun.com/miniapp/) · [Contribute](./CONTRIBUTING.md)
15+
[Download Desktop](https://openbitfun.com/download) · [Mobile Releases](https://github.com/GCWing/OpenBitFun/releases?q=mobile-&expanded=true) · [Mini App Marketplace](https://market.openbitfun.com/miniapp/) · [Contribute](./CONTRIBUTING.md)
1616

1717
[![Website](https://img.shields.io/badge/Website-openbitfun.com-0b7285?style=flat-square)](https://openbitfun.com/)
1818
[![Core code: MIT](https://img.shields.io/badge/core_code-MIT-yellow?style=flat-square)](./LICENSE)

‎README.zh-CN.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你
1212

1313
**如果你也期待这样的 Agent,欢迎点亮 ⭐ Star,让更多人发现 OpenBitFun。**
1414

15-
[下载体验](https://openbitfun.com/zh/download) · [Mini App 市场](https://market.openbitfun.com/miniapp/) · [参与共建](./CONTRIBUTING_CN.md)
15+
[下载桌面端](https://openbitfun.com/zh/download) · [移动端 Release](https://github.com/GCWing/OpenBitFun/releases?q=mobile-&expanded=true) · [Mini App 市场](https://market.openbitfun.com/miniapp/) · [参与共建](./CONTRIBUTING_CN.md)
1616

1717
[![官网](https://img.shields.io/badge/%E5%AE%98%E7%BD%91-openbitfun.com-0b7285?style=flat-square)](https://openbitfun.com/zh)
1818
[![Core code: MIT](https://img.shields.io/badge/core_code-MIT-yellow?style=flat-square)](./LICENSE)

‎design-system/packages/ui/src/components/Tooltip/Tooltip.tsx‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,13 @@ export function Tooltip({
263263
// Capture nested, non-bubbling scrolls during both delayed and visible states.
264264
// Dormant tooltips do not need a document-level scroll subscription.
265265
if (view && !scrollCleanupRef.current) {
266-
const dismissOnScroll = () => hideCurrentRef.current();
266+
const dismissOnScroll = (event: Event) => {
267+
// Scrolling the tooltip's own scroll container (a wheel over the
268+
// preview or a scrollbar drag inside it) is not a moving anchor.
269+
const surface = tooltipRef.current;
270+
if (surface && event.target instanceof Node && surface.contains(event.target)) return;
271+
hideCurrentRef.current();
272+
};
267273
view.addEventListener("scroll", dismissOnScroll, { capture: true, passive: true });
268274
view.visualViewport?.addEventListener("scroll", dismissOnScroll, { passive: true });
269275
scrollCleanupRef.current = () => {

‎docs/architecture/product-architecture.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ block-beta
198198
| Assembly | `src/crates/assembly/*` | `agent-content`、`core`、`external-sources`、`product-capabilities` |
199199
| Adapters | `src/crates/adapters/*` | `agent-runtime-ipc`、`ai-adapters`、`claude-code-adapter`、`codex-adapter`、`dsh-adapter`、`opencode-adapter`、`static-hook-support`、`transport`、`webdriver` |
200200
| Services | `src/crates/services/*` | `services-core`、`services-integrations`、`miniapp-market-service`、`skin-market-service`、`relay-service`、`page-function-runtime`、`terminal` |
201-
| Execution | `src/crates/execution/*` | `agent-runtime`、`agent-workflows`、`agent-stream`、`plugin-runtime-client`、`runtime-services`、`tool-contracts`、`tool-provider-groups`、`tool-execution`、`tool-call-jsonrepair` |
201+
| Execution | `src/crates/execution/*` | `agent-runtime`、`agent-workflows`、`agent-stream`、`plugin-runtime-client`、`runtime-services`、`tool-contracts`、`tool-provider-groups`、`tool-execution` |
202202
| Contracts | `src/crates/contracts/*` | `core-types`、`events`、`runtime-ports`、`product-domains` |
203203

204204
Installer、E2E 以及 MiniApp/Skin market server 和对应 service 在 Level 0 图中分别归入交付入口、测试范围或 Services 家族,不作为独立架构模块。

0 commit comments

Comments
 (0)