Electric Agents 移动端演进解析:React Native 客户端从 Cloud 接入到商店上架的完整技术路径
2026/9/16 8:31:39 网站建设 项目流程

Electric Agents 移动端演进解析:React Native 客户端从 Cloud 接入到商店上架的完整技术路径

【免费下载链接】electricThe agent platform built on sync.项目地址: https://gitcode.com/GitHub_Trending/el/electric

本文以 packages/agents-mobile/CHANGELOG.md 为主线,结合 agents-mobile 包的源码、Expo 配置与 CI 配置,梳理@electric-ax/agents-mobile(Electric Agents 的移动客户端)从 0.0.1 到 0.6.5 的功能演进与工程实践。读者可以借此掌握:移动端如何通过 Electric 的同步协议连接 agents 服务器、如何完成 Cloud OAuth 登录、原生聊天交互如何逐步替代 WebView、以及为 App Store / Google Play 上架做了哪些隐私与兼容性打磨。

@electric-ax/agents-mobile是 Electric Agents 生态中的 React Native(Expo)客户端,用于在手机上登录 Electric Cloud、选择 agent 服务器、创建并运行 agent 会话、与正在运行的 agent 聊天。它的演进史几乎浓缩了移动端接入"基于同步的 agent 平台"的全部关键问题:OAuth 深链、认证头注入、形状同步、原生 vs WebView 渲染、应用商店审核合规。下面按功能主线而非单纯版本顺序展开。

一、包定位与技术栈

1.1 在 monorepo 中的位置与依赖关系

agents-mobile 依赖同仓库的两个核心包(见 packages/agents-mobile/package.json):

  • @electric-ax/agents-runtimeworkspace:*):提供 slash 命令语法、composer 输入序列化、URL 拼接等共享能力,通过/client子路径导出;
  • @electric-ax/agents-server-uiworkspace:*):提供认证 fetch(serverFetch)、实体 API URL 助手、上传附件等桌面/移动共享逻辑。

移动端本身没有本地 runtime(不像桌面端可以跑本地 Horton agent),因此它本质上是"远程 agent 服务器的移动控制台"——这正是 onboarding 向导中没有桌面向导的"model providers"步骤的原因(OnboardingScreen.tsx 中注释明确说明)。

1.2 客户端技术栈

从 package.json 可以看到完整的技术选型:

领域选型
框架Expo 54.0.35 + expo-router ~6.0.24 + React Native 0.81.5 + React 19.1.0
同步@tanstack/db@tanstack/electric-db-collection@tanstack/react-db(Electric shape 同步到本地集合)
原生能力expo-image-picker(图片附件)、expo-clipboard(复制会话 ID)、expo-linking/expo-web-browser(OAuth)、expo-splash-screenexpo-system-ui
监控@sentry/react-native
存储@react-native-async-storage/async-storage(登录态、置顶会话等本地状态)
校验zod(形状 schema 解析)

脚本方面提供了start/android/ios/web四个启动入口,以及typechecktest(vitest)、doctor(expo-doctor)、export:android/export:ios(纯 JS bundle 导出)和ci:check(typecheck + doctor + export:android)用于 CI。

二、从零起步:0.0.1 打通 Cloud 接入

2.1 三层 Cloud 能力落地

0.0.1 一次性引入了三个基础能力(见 CHANGELOG 中ca01b9d8fd9bfa64d9354508742f):

① React Native 应用骨架:创建 agents-mobile 包并接入 Expo Router 路由体系。

② Electric Cloud 登录:通过dashboard.electric-sql.cloud的 loopback OAuth 流程(桌面端与 CLI 同款),用全屏<WebView>承载 OAuth 页面并通过onShouldStartLoadWithRequest拦截回调 URL,无需任何后端改动。登录后通过auth.whoami拉取用户名与工作区列表,并支持一键跳转 Cloud 控制台。

③ 端到端连接 Cloud agent 服务器:这一步是移动端接入的"硬核"部分,在 agentsClient.ts 中仍有完整实现:

  • 令牌交换:把 dashboard JWT 兑换成服务级 agents token(getTokenForAgents);
  • 认证注入:在每次出站请求上注入Authorization/x-electric-service/electric-principal三个头(经serverFetch+ shape collection 的fetchClient,包括 React Native 长轮询DurableStream),并把这些头作为 prop 转发到 Expo DOM-embed 边界,让 embed 内部自己的auth-fetch实例也能复用;
  • URL 组装:改用appendPathToUrl处理带?service=…的 Cloud URL;
  • 正确 spawn:通过规范的/_electric/entities/<type>/<name>端点,把initialMessage放进请求体——这修复了一个 STREAM_NOT_FOUND 竞态(此前 PUT 后再 POST /send 时,spawn 确认可能先于流就绪返回,导致首条消息 404);
  • runner 选择器:让用户指定某个 pull-wake runner 来承接会话。

④ 服务器发现:登录 Cloud 后,onboarding 的服务器选择步骤(以及独立的 server-setup 屏幕)会列出用户可见的全部 agent 服务器,按 Workspace › Project › Environment › Server 面包屑展示,一键填充 URL;同时保留手工输入 URL 以支持本地/非 Cloud 服务器。桌面端与移动端订阅同一组四个 admin-API shapes(agent-serversenvironmentsprojectsworkspaces)并在客户端 join。

2.2 同步模型:五种 shapes + 客户端集合

AgentsProvider.tsx 定义了移动端同步的全部数据面:

  • entitiesCollection(会话实体)
  • entityTypesCollection(agent 类型及其creation_schemaslash_commands
  • runnersCollection(runner 及其sandbox_profiles
  • usersCollection(租户内用户)
  • entityEffectivePermissionsCollection(当前 principal 的有效权限)

这些集合统一通过/_electric/electric/v1/shape端点以 Electric shape 方式同步(见 agentsClient.ts 中createEntitiesCollection等工厂函数),并定义了 zod schema 做运行时校验。0.0.2 还引入了一个"细粒度响应式实体时间线查询":时间线行由 TanStack DB 用多源查询和 live child collections 维护,agent 流式响应可以增量更新,而无需整体重建整个聊天时间线。

2.3 信号控制(0.0.3)

0.0.3 引入移动端 agent 信号控制:运行中会话的输入框出现停止控件;会话菜单以子菜单形式暴露全部实体信号类型;内嵌聊天时间线为原生 composer/drawer 留出 inset,并对齐消息宽度、做底部渐隐遮罩。

SessionMenu.tsx 中的SIGNAL_OPTION_GROUPS是信号集的完整定义:

  • 中断/停止组SIGINT(中断当前运行并继续)、复合信号SIGSTOP+SIGINT("Stop immediately");
  • 暂停/继续组SIGSTOP(当前运行结束后暂停)、SIGHUP(当前运行结束后重载)、SIGCONT(恢复暂停)、SIGUSR(投递给信号处理器);
  • 终止组(destructive):SIGTERM(优雅永久停止)、SIGKILL(立即永久终止)。

三、OAuth 深链攻坚:Android 登录流的多层修复(0.0.6)

0.0.6 是移动端最典型的一次"真机问题"修复:Android(尤其 13+ 的 release 构建)上 Chrome Custom Tab 的electric-agents://oauth/callback重定向会丢失,导致登录永远无法完成、用户被弹回欢迎页。CHANGELOG 记录了五层加固,源码中均有对应实现:

  1. Config plugin 注入onNewIntent:with-android-on-new-intent.js 通过withMainActivity修改生成的MainActivity.kt,添加:
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) }

这是因为 Android 13+ 在用户停留于 Custom Tab 时会杀掉应用进程,重定向回来时通过新 intent 重启 Activity;默认模板的MainActivity不重写onNewIntent,导致getIntent()一直指向最初的 LAUNCHER intent。该插件还有两个工程细节:必须从expo/config-plugins导入(pnpm 不会把@expo/config-plugins提升进本包 node_modules);会做重复注入检测,避免手工补丁过的工程被二次注入。

  1. 全局深链监听:除/oauth/callback路由外,CloudAuthProvider额外挂载全局Linking监听,让冷启动重定向在 Expo Router 导航到路由之前就能被消费。

  2. parseCallbackUrl改用Linking.parse:Hermes release 构建中new URL()对自定义 scheme 不可靠(searchParams.get()可能对存在的参数静默返回null),而expo-linking的解析器专为应用深链设计。

  3. signIn的深链等待期:当浏览器会话返回dismiss(Android 上"成功但被 OS 杀进程"的典型表现)时,不立即回滚到signed-out,而是等待DISMISS_GRACE_MS = 6000ms,见 cloudAuth.ts:

const DISMISS_GRACE_MS = 6000
  1. completeCallbackUrl幂等:三路并发处理器(浏览器会话结果、全局 Linking 监听、/oauth/callback路由)可能同时消费同一 URL,completingUrl去重保证不会互相踩踏。

此外,/oauth/callback路由改为在渲染阶段用<Redirect>导航(而非 effect 里的router.replace,后者在 dev 构建中会与 Expo Router 自身的 intent 处理竞态),并把用户引导到/onboarding而不是/SessionListScreenAgentsProvider未挂载时访问useAgents会崩溃)。配套新增useAgentsRouteGuard,对//session/new-session/diagnostics做路由守卫,未完成设置时重定向到/onboarding//server-setup

cloudAuth.ts 中CloudAuth类是一个"非 React 的单例状态机":维护signed-out / signing-in / signed-in / error状态、通过subscribe/setState通知CloudAuthContextsignIn生成 CSRF state(crypto.randomUUID(),回退Math.random),校验回调中的 state 防 CSRF;getAgentsToken(serviceId)做 per-service agents token 的内存缓存;whoami刷新把 401/403 视为硬登出。出于移动端限制,登录流程不使用桌面/CLI 的 loopback HTTP(Google 的 "Use Secure Browsers" 政策禁止内嵌 WebView 承载 OAuth),而是走系统浏览器 + 自定义 scheme 深链。

四、聊天体验:从 WebView 渐进走向原生(0.0.14 / 0.0.15 / 0.6.2)

4.1 原生 slash-command composer(0.0.14)

0.0.14 让移动端输入框获得与桌面端对齐的 slash 命令能力,且跑在原生TextInput上而非 WebView:自动补全、结构化composer_input载荷、命令/参数的内联高亮。关键在于共享语法——slash 命令语法和序列化器被移入@electric-ax/agents-runtime并经由/client导出,成为两个平台唯一的 truth source;桌面 composer 改为复用它们且行为不变。

slashAutocomplete.ts 展示了纯函数化的实现思路,全部逻辑不依赖 WebView 坐标:

  • resolveSlashTrigger(value, selection):用TextInput.onSelectionChange上报的光标位置解析当前触发词(支持在文本中间触发;范围选择则抑制菜单;在 RN 尚未回报首个 selection 事件前假定光标在末尾,保证敲下/的瞬间菜单就弹出);
  • filterSlashCommands:前缀过滤,上限MAX_SLASH_SUGGESTIONS = 8,与桌面端一致;
  • computeHighlightRanges:把已识别命令(连同其声明数量的参数词)渲染成"徽章",未知/token保持原样;
  • buildSlashCommandInsertion:在触发区间内拼入/command并把光标落在参数位。

NativeComposer.tsx 中的useSlashAutocompletehook 把这些纯函数接到 RN 状态上,让弹层(SlashCommandMenu)保持原生。

4.2 Schema 驱动的创建表单与图片附件(0.0.15)

0.0.15 把桌面SchemaForm的能力带到移动端:

  • schema 驱动 spawn args:new-session 屏幕把 agent 类型的creation_schema渲染为原生控件——enum 属性变 picker sheet(model 枚举按 provider 分组并记住上次选择)、boolean 变 switch、string/number 变文本字段、string-array 变逗号分隔字段、其他对象变 JSON 字段;必填项门控Start session按钮,按钮固定在屏幕底部(滚动内容留出 padding)。
  • 图片附件:会话内与新建会话两个 composer 都能经expo-image-picker从照片库/相机附图,是否允许取决于会话模型是否接受图片输入;spawn 后首条消息立即发送以锁定上传目标。共享发送路径uploadMessageAttachments同时接受浏览器File与 React Native 文件描述符;schema 分类助手(inlineSchemaProperties、model/reasoning/speed 探测、model-settings 分组)抽成桌面/移动共用的lib/schemaProperties模块。
  • 会话标题生成加固:当首条消息引用模型看不到的图片时,Horton 的标题模型可能"道歉式跑题",把道歉句当成标题。修复是系统提示要求按意图推断标题且绝不道歉,外加一个 guard 拒绝句子式输出、回退到本地派生标题。

4.3 时间线防闪烁(0.6.2)

0.6.2 修复了发送消息、composer 伸缩(多行/附件)和消息排队时聊天时间线闪烁的问题:WebView embed 现在改为命令式接收动态更新(底部 inset、内联排队消息、滚动),而不是通过 props 触发的 re-render;同时修复快速打字时发送后 composer 偶尔不清空的问题。

五、协作与权限:置顶、分享、fork(0.0.13 / 0.0.16 / 0.6.0)

5.1 会话置顶(0.0.13)

长按根会话行(或任意搜索结果)弹出 context sheet,展示实体信息(标题、会话 ID、类型/状态、子 agent、runner、sandbox、spawned、last active)与 Pin/Unpin;会话内 kebab 菜单同样有 Pin/Unpin 项。置顶会话显示在分组上方的 Pinned 区,按设备持久化到 AsyncStorage(pinnedEntities.ts),是 Web 侧边栏置顶的移动镜像。

5.2 会话分享(0.0.16)

0.0.16 把桌面ShareEntityDialog的能力以移动优先的 UX 落地(ShareSessionScreen.tsx):

  • 模态路由从会话菜单的Share进入;
  • 链接 pill:展示缩写后的会话 Web URL,一次点击唤起系统分享面板(含 Copy);
  • People with access列表(Owner 行置顶)+ Google Drive 风格的General access区(对工作区级All users授权)+ 搜索优先的Add people区;
  • 角色(View / Chat / Manage,权限集与字形同桌面端)逐行通过 bottom-sheet picker 提交,含破坏性的Remove access,没有延迟的 Grant/Update 按钮;
  • 授权列表来自受 manage 保护的 RESTGET /grants端点——同步的 effective-permissions shape 只覆盖当前 principal,无法列出他人的访问权限;非 manager 仍可使用链接操作并看到需要 manage 权限的提示。

会话 Web 链接由 sessionLinks.ts 的sessionWebUrl()生成:直接拼{serverUrl}/__agent_ui/#/entity/{id},而不是服务器根路径——因为根路径的绝对路径 302 重定向会丢掉 Cloud 的/t/<service-id>/v1租户前缀。会话 ID 可用sessionIdFromEntityUrl()提取并在菜单状态头、长按行中一键复制(SessionMenu.tsx)。共享的用户展示助手userDisplay()/initials()移入agents-server-uilib/userDisplay.ts,授权 diff/移除/访问模型分组逻辑则沉淀为纯函数、可单测的entityGrants模块。

5.3 能力前奏:租户用户与权限(0.0.11)

0.0.11 已把 tenant-scoped users 暴露为 Electric shape,并加入聊天分享对话框:可授予用户 principal 或工作区全部用户 view/chat/manage 权限;view/chat 分享包含 fork 访问权;fork 出的聊天归创建它的 principal 所有;侧边栏可按创建者标识与过滤共享聊天;Cloud 请求会把已登录用户注入为 Electric principal。移动端随之同步 users 与 effective-permissions shapes、标记与过滤共享聊天、在权限不足时禁用聊天与信号控件,并在 Account 屏显示当前 principal 便于调试。

5.4 双通道 Fork(0.6.0)

0.6.0 把桌面端 fork 能力补齐到移动端,且"无服务器 API 变更":

整棵子树 fork:会话 kebab(SessionMenu)中新增受控的Fork subtree项——仅根实体(!entity.parent)、会话已停止/杀死或调用者缺fork权限时禁用;带 single-flight 防重入、pending spinner 与内联错误;成功后导航到新根。底层是 agentsClient.ts 中的原生forkEntity(POST…/fork,空 body = 整棵子树 HEAD 克隆),构建在共享的entityApiUrl助手之上并经由AgentsProvider暴露;SESSION_PERMISSIONS增加fork,原生图标集新增git-fork字形。

逐条消息 "Fork from here":共享ChatLogViewembed 里的 pointer fork 之前走 WebView 的fetch,现在其 mutation 改走原生 RN 网络——createForkEntity增加可选 transport 参数,embed 注入编组后的onRequestForkEntity回调,使 embed 里唯一的 mutation 与移动端其他 mutation 走同一条原生路径(镜像桌面端的 Electron IPC 路由),同时保留共享的失败 toast 行为。

嵌入按钮加固:抽出经过测试的singleFlight原语,嵌入 fork 按钮增加 spinner + disabled 态,并在 embed 内挂载ToastProvider,让 fork 失败在 WebView 内可见而不是消失于无监听器的总线。

六、上架打磨:隐私、权限、图标与崩溃监控(0.0.8 / 0.0.11 / 0.6.4)

6.1 Sentry 崩溃上报(0.0.11)

0.0.11 接入 Sentry:仅上报错误、开发环境禁用,source-map 上传通过withSentryExpo 配置插件与getSentryExpoConfigmetro 包装器接通。sentry.ts 展示了初始化参数——enabled: !__DEV__tracesSampleRate: 0(不上报 trace)、sendDefaultPii: false;DSN 是随二进制分发的公开标识符,可通过EXPO_PUBLIC_SENTRY_DSN在打包时覆盖。app.config.ts 中 Sentry 配置指向 EU 区域(https://de.sentry.io/),与 DSN host 保持一致。app/_layout.tsxSentry.ErrorBoundary把未捕获的渲染错误变成可恢复页面(带 "Try again"),而不是白屏崩溃。

6.2 iOS 16.4 部署目标(0.0.11)

一个非常典型的"隐性兼容"问题:聊天渲染在 Expo DOM WebView 中,其 markdown 栈用到 regex lookbehind,而 JavaScriptCore 只在 iOS 16.4+ 才支持,低于该版本整个 DOM bundle 解析失败、聊天空白。修复是把 iOS 最低部署目标提升到 16.4(经expo-build-properties),配置见 app.config.ts:

[`expo-build-properties`, { ios: { deploymentTarget: `16.4` } }],

6.3 商店审核合规(0.6.4 + 0.0.8)

0.6.4 为 App Store / Play 审核做了系统性的"清扫"(对应源码都在 app.config.ts):

  • iOS 隐私清单:为 required-reason API(AsyncStorage + Sentry 使用的 UserDefaults、文件时间戳、系统启动时间、磁盘空间)声明privacyManifestsNSPrivacyAccessedAPITypesCA92.1/C617.1/35F9.1/E174.1),收集的数据类型仅声明崩溃数据与性能数据(App Functionality);NSPrivacyTracking: false。注释解释:Apple 会拒绝(ITMS-91053)调用 required-reason API 而不声明的上传,且不可靠地读取静态链接 pod 自己的清单,所以必须在 app 级声明。
  • 权限最小化expo-image-picker配置microphonePermission: false,丢掉未使用的麦克风权限;Android 侧blockedPermissions: ['android.permission.RECORD_AUDIO', 'android.permission.READ_EXTERNAL_STORAGE']。注释特别说明WRITE_EXTERNAL_STORAGE故意保留——image-picker 在 Android 10(API < 29)之前的相机路径硬依赖它,屏蔽会破坏 Android 7–9 的拍照。
  • 品牌化:启动屏(深色背景 + splash 图标,避免冷启动白闪)、不透明 iOS 图标、Android 13+ monochrome adaptive-icon 层(adaptive-icon-monochrome.png,系统按壁纸着色)、新增expo-system-uiuserInterfaceStyle在 Android 生效。
  • 错误边界:整个应用包进可恢复错误边界(上文 Sentry.ErrorBoundary)。
  • OAuth 回调超时逃生舱:等待深链的窗口期逻辑(对应DISMISS_GRACE_MS),防止卡死在 spinner。
  • 日志纪律:认证诊断只进开发日志(devWarn__DEV__门控),生产设备日志(logcat / Console.app)不出现 token 交换与 HTTP 状态细节。

0.0.8 则补上了 Google Play 的硬性要求——Account 屏在登录 Electric Cloud 时显示Delete account按钮,点击在系统浏览器打开账户删除说明页。0.0.8 还完成了 onboarding 的移动优先重设计(见下节)。

七、Onboarding 与设置流程的收敛(0.0.8 / 0.0.11)

7.1 强制两步向导

0.0.8 把 onboarding 重设计为镜像桌面向导的两步流程(Cloud 登录 → Server 选择),并在保存服务器连接前强制展示

  • 移除 "Don't show this again" 与 "Skip for now" 逃生阀,形成不变量onboardingDismissed=true ⟹ serverUrl is set(app/_layout.tsx 中的重定向逻辑强制执行该不变量);
  • Cloud 服务器行点击即通过新的onConnect(url)回调提交连接(修复了此前点击只填充 URL 输入框的 bug);自托管 URL 手工输入收进可折叠的 "Custom server" 区并内联报错;
  • ServerSetupScreen基于第 2 步的版式重写,让 Settings → Server 与 onboarding 服务器步骤保持对齐;
  • Cloud → server 的自动推进在每次登录转换中只发生一次(用startStep播种),避免热重启恢复会话后按 Back 又被静默推回;
  • DiagnosticsScreen增加__DEV__门控的Clear all local data:清空 AsyncStorage、登出 Cloud、重载 JS bundle 进入全新 onboarding,文案对齐桌面 Settings → General → Reset。

0.0.11 还加固了 kebab 菜单的服务器选择器:连接失败在 sheet 内展示而不是静默吞掉,Cloud 服务器只在切换成功后持久化,子菜单关闭动画结束后才复位到根页面。

7.2 列表与视觉收敛

0.0.8 让移动端会话概览对齐桌面侧边栏:隐藏 principal 实体、状态分组采用相同的生命周期排序;并为内嵌 stream WebView 启动时的白屏闪烁问题,把主题背景应用到所有原生 DOM/WebView 层(0.0.81331cf6)。

八、工程基建:EAS、CI 与依赖治理

8.1 动态 Expo 配置与 EAS profiles(0.0.6 / 0.0.8)

0.0.6(c1834f3)为 EAS builds 与 CI 做了系统准备:动态 Expo config、EAS build profiles、移动端 CI/export 脚本,并对齐共享 React/TypeScript 依赖解析,让 Expo DOM embed 通过类型检查与expo-doctor。0.0.8(1c6ebf9)进一步把expo升到 54.0.35、expo-router升到 ~6.0.24,使Agents Mobile PRCI 不再因 expo-doctor 的 SDK 版本匹配检查失败。

eas.json 定义了六档构建 profile:development(developmentClient,内部)、preview/preview-ios-simulator(APK / 模拟器)、canary(APK)、canary-storeproduction(store 分发),并带 Android 提交通道配置(track: internal/track: production)。app.config.ts中的resolveVersionCode()展示了一个跨 CI 流程保证单调递增版本号的技巧:优先读ELECTRIC_AGENTS_MOBILE_VERSION_CODE环境变量,其次读 CI 预写的.build-info.json,最后回退Date.now()/1000整数。

8.2 @tanstack/db 单实例治理(0.0.11)

@tanstack/db实际是单例(collection/transaction/live query 依赖instanceof检查与模块级状态),但 lockfile 漂移出了多个0.6.x副本,破坏 StreamDB 集合。修复分两步:

  1. 先在根pnpm.overrides>=0.6.0 <0.7.0全部折叠到 0.6.7(范围限定,不触碰钉在0.0.x/0.5.8的旧示例 starter);
  2. 随后@durable-streams/state@0.3.x@tanstack/db改为可选 peer 依赖并把 tsdb 耦合工具拆到@durable-streams/state/db子路径,于是移除 override,通过把@tanstack/react-db提到^0.1.85@tanstack/electric-db-collection提到^0.3.5@durable-streams/server提到^0.3.7来收敛到单一 0.6.7。

8.3 服务器 URL 形态统一(0.0.6)

0.0.6(d344c32)把 Electric Agents 服务器 URL 统一为 opaque 的租户级 base URL(根于/t/<tenant-id>/v1),桌面与移动 Cloud 客户端同步迁移;观察流 ensure 端点归入/_electric/observations/*/ensure-stream;预 alpha 的 entity/cron/schema/tag/docs API 更名;新增非交互式electric agents viewtranscript 命令;Horton 标题提取适配轻量桌面 inbox collection facades。

九、如何体验与验证

在 monorepo 根目录安装依赖后,进入 packages/agents-mobile 即可启动:

pnpm install cd packages/agents-mobile pnpm start # 启动 Expo dev server pnpm android # 在 Android 模拟器/设备运行 pnpm ios # 在 iOS 模拟器/设备运行 pnpm web # 浏览器预览(web 入口)

质量与 CI 相关命令(见 package.json):

pnpm typecheck # tsc --noEmit pnpm test # vitest(agentsClient / slashAutocomplete / entityGrants / pinnedEntities 等均有单测) pnpm doctor # expo-doctor 检查 pnpm export:android # 导出 Android bundle(CI 用) pnpm ci:check # typecheck + doctor + export:android

移动端没有本地 runtime,运行前需要准备一个可达的 agent 服务器(本地自托管或 Electric Cloud),首次启动必须完成 Cloud 登录与服务器选择两步向导。

结语

从 CHANGELOG 的演进脉络可以看出,agents-mobile的成熟并非单一功能堆叠,而是"同步协议接入 → 原生交互替代 → 协作能力补全 → 上架合规收敛"四个阶段的螺旋上升:底层始终依赖 Electric shape 同步与共享的agents-runtime/agents-server-ui能力,移动端特有的深链、WebView embed、权限与隐私问题则在每个版本中被逐个击破。对于想要在 React Native 中构建"同步驱动的 agent 客户端"的开发者,这个包连同其测试(如 agentsClient.test.ts、slashAutocomplete.test.ts、entityGrants.test.ts)是一份可对照的完整参考实现。

【免费下载链接】electricThe agent platform built on sync.项目地址: https://gitcode.com/GitHub_Trending/el/electric

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询