编码:UTF-8
目标:一个类似“微信开发者工具”的 Function Kit / IME 调试器。
当前状态:Phase 1(Web Runner + Host Simulator + DevTools Panels + 可回放)。
cd kit-studio
powershell -ExecutionPolicy Bypass -File .\scripts\dev.ps1打开:
http://127.0.0.1:39001/
说明:Electron 版本更接近“微信开发者工具”形态,并附带基础安全护栏(阻止远程导航/弹窗/权限请求、限制请求 origin)。 下载策略:Electron 会阻止所有下载;会话/Remote Attach 导出改为 Save Dialog 写文件(不会再走浏览器 download)。
cd kit-studio
npm install
npm run electron可选:
- 指定 Node 启动 server:
$env:KITSTUDIO_NODE="C:\\Program Files\\nodejs\\node.exe"
- UI 使用 shadcn/ui 风格(Tailwind + CSS variables tokens),并支持 Light / Dark / System 主题切换(右上角「主题」)。
- 若你要改 UI 样式:先执行
npm install,然后执行npm run css:watch(或npm run css:build)。
- 推荐主流程:
Workspace→Host Input Lab→Inspector / Network / Files / Tasks。 - 先在本地 Host Simulator 里把打字、权限、网络、文件、安装链路跑通,再看更低频的实验能力。
- 当前本地优先缺口清单:
LOCAL_FIRST_GAPS.md
- 中间 Runner 右上角「视角」支持 IME 面板/Inline 的固定 viewport(更贴近“输入法功能件”的真实尺寸)。
- Runner 右上角支持「缩放」(默认 90%)与「键盘」(mock,高度可选)以便做更逼真的比例验收;两者会持久化到 localStorage。
- 默认 IME 视角会显示“假手机屏幕”(bezel + status bar + app placeholder),并将 IME 面板锚定在屏幕底部;
桌面自适应会自动还原为全尺寸。
- 左侧
Host Events支持模拟:binding.invoke(用于bridge-debugger验收绑定触发链路)send.intercept.ime_action.intent(用于拦截器/策略调试)
说明:Remote Attach 继续保留,但已降级为实验能力,不是当前日常开发主流程。
- 左侧
Remote Attach:channel可留空直接连接(会自动选择最近活跃 channel,或展开 Channels 列表引导你选择)。 - 连接后会通过 SSE 订阅:
GET /api/attach/stream?channelId=<channel> - 连接时会自动拉取最近 history(limit=200),并按
eventId去重;日志时间戳使用receivedAtEpochMs(更贴近真实发生时间)。 - Remote Attach
mode:抓包(只看):只写入 Inspector镜像(kit→remote):把本地 kit 的ui->host/host->ui写入 channel(供远端订阅)桥接(kit↔remote):在镜像基础上,把 remote 的host->ui注入到当前 kitRemote Host:绕过本地 Host Simulator(除bridge.ready外不再响应),由远端宿主负责回包
- 外部宿主可推送 envelopes:
POST /api/attach/envelope- body 最少:
{ origin, clientId, direction, envelope }(channelId可省略:会按origin/clientId/envelope.kitId自动推导)
- body 最少:
- Pair Code(一次性配对码,推荐):DevTools「高级 / Channels」点击「生成」得到
KS-XXXXXXXX,粘贴到 Android 的KitStudio attach token,会自动兑换为 bearer token(write scope),避免手抄长 token。 - Channels 工具:
- 列表:
GET /api/attach/channels - 清空:
DELETE /api/attach/channel?channelId=<channel> - UI 侧「高级 / Channels」支持:复制 SSE URL / 复制 POST 示例 / 导出当前 channel history(JSON)
- 导入:工具栏「导入会话」也支持导入
kind=kitstudio.attach.channel(会把events[]转成 Inspector log,并尝试打开对应 kit)
- 列表:
- 安全(可选):
- token(admin):在
kitstudio.config.json配置attach.token(或 envKITSTUDIO_ATTACH_TOKEN);UI「高级 / Channels」可填写 token 用于 SSE/fetch/curl 示例。 - allowlist:在
kitstudio.config.json配置attach.allowOrigins/allowClientIds/allowKitIds(不配置则默认全允许)。
- token(admin):在
- 版本标识:
GET /api/health会输出version/gitCommit,并在 UI 顶部显示短 commit(用于排查“旧 server 常驻”)。
- 顶栏「导出工作区 / 导入工作区」保存/恢复:主题、Runner 视角/缩放/键盘、可选的 Remote Attach 配置、以及当前会话快照(可回放)。
- 若当前填写了 Remote Attach token,导出时会提示是否把这个实验能力的 token 明文写入工作区文件(取消=不包含)。
- Catalog:
GET /api/kit-packages(可直接粘贴到 Android Download Center 的 Catalog URL)。 - ZIP:
GET /api/kit-packages/<kitId>.zip(Android 下载中心「Install from URL」可直接安装)。 - Metadata:
GET /api/kit-packages/<kitId>.json(包含sizeBytes/sha256,用于 Host 校验)。 - UI:左侧
Packages卡片提供「复制 Catalog URL」与每个 kit 的「复制 ZIP URL」。
cd kit-studio
powershell -ExecutionPolicy Bypass -File .\scripts\e2e.ps1或:
npm run e2e可视化(有头浏览器,便于调试):
powershell -ExecutionPolicy Bypass -File .\scripts\e2e.ps1 -Headednpm run e2e:headed这条用真实 provider 跑一次
runtime-lab的ai.request,然后保存为 replay 并再次命中。默认不进主 E2E,避免把 secret / 外网依赖强塞给所有开发机。
统一入口(只跑 AI smoke):
$env:KITSTUDIO_E2E_AI_BASE_URL="https://api.deepseek.com/v1"
$env:KITSTUDIO_E2E_AI_API_KEY="<your-key>"
$env:KITSTUDIO_E2E_AI_MODEL="deepseek-chat"
npm run e2e:ai-real低层脚本入口:
powershell -ExecutionPolicy Bypass -File .\scripts\e2e-ai-real.ps1 `
-ProviderBaseUrl $env:KITSTUDIO_E2E_AI_BASE_URL `
-ProviderApiKey $env:KITSTUDIO_E2E_AI_API_KEY `
-ProviderModel $env:KITSTUDIO_E2E_AI_MODEL若要把 AI smoke 串到完整 UI E2E 之后:
npm run e2e:full-plus-ai说明:
- 本脚本按
vercel-labs/agent-browserREADME 的 CLI 工作流跑 E2E(open/wait/select/click/upload/get/eval)。 scripts/e2e.ps1 -AiRealOnly是统一入口里的 AI-only 模式;scripts/e2e.ps1 -IncludeAiReal会在常规 UI E2E 之后继续调用scripts/e2e-ai-real.ps1。两者若未显式传参,都会读取 env:KITSTUDIO_E2E_AI_BASE_URL / KITSTUDIO_E2E_AI_API_KEY / KITSTUDIO_E2E_AI_MODEL。scripts/e2e-ai-real.ps1会验证三件事:real模式已配置、runtime-lab首次请求拿到真实ai.response、保存 replay 后二次请求命中replay hit。- 为避免 Windows PowerShell 捕获输出导致 agent-browser daemon 首次启动卡住,脚本内部通过
cmd.exe重定向输出文件来读取--json结果(详见e2e/logs/,已忽略)。 - kit UI 在同源 iframe 内,脚本用
eval -b操作 iframe 内的 DOM,避免frame在该环境下偶发不稳定。 - agent-browser 版本默认固定为
0.23.0(可通过 envKITSTUDIO_AGENT_BROWSER_VERSION覆盖),避免 npx 因上游版本缺失报ETARGET。 - 若
39001端口已有旧 KitStudio 常驻(但缺少新 endpoint),脚本会探测GET /api/attach/history/GET /api/kit-packages/GET /api/e2e/delay?ms=0并自动重启旧进程(仅匹配node ... src\\server.mjs)。 - 若
kitstudio.config.json的host为0.0.0.0(对外监听),E2E 会自动用127.0.0.1作为浏览器访问地址;需要指定其他地址时可设置 envKITSTUDIO_CLIENT_HOST(例如192.168.1.10)。 scripts/e2e.ps1与scripts/e2e-ai-real.ps1含中文提示,需以 UTF-8 BOM 保存以兼容 Windows PowerShell(仓库内已处理)。- 若机器上已有 Chrome/Edge,会自动使用;否则可先执行:
npx --yes agent-browser@0.23.0 install - 当前覆盖:
- UI:Light/Dark 主题切换;Runner 视角/缩放/键盘 mock;Workspace 导入/导出;Packages(Catalog/ZIP 复制、filter)
- Host Simulator:权限 revoke/grant + sync;context editor sync/reset
- Host Input Lab:selection、
Shift+Enter本地换行、Enter / IME action 差异 file-upload-lab:settings.open/storage.get/set/files.pick/network.fetch(bodyRef)(/api/e2e/echo)task.cancel:对慢network.fetch(/api/e2e/delay)发起取消,断言任务进入canceled- DevTools Panels:Inspector/Storage/Network/Files/Tasks(含清空/同步/导出会话/导入会话/Reload Kit)
- Experimental / Remote Attach:连接/Channels 列表/一次性 Pair Code
bridge-debugger:模拟binding.invokeime-hooks:input.observe.best_effort+send.intercept.ime_action(intent→result→宿主落地)
- 截图输出:
e2e/screenshots/kitstudio-e2e*.png(包含kitstudio-e2e-99-annotated.png的可视化标注截图)
kitstudio.config.json 默认挂载当前工程里的:
../../../function-kits(浏览器式 kit UI)../../../function-kit-runtime-sdk(浏览器 bundle)
如果你的目录结构不同,可以编辑 kitstudio.config.json,或用环境变量覆盖:
KITSTUDIO_FUNCTION_KITS_ROOTKITSTUDIO_RUNTIME_SDK_ROOT
如需按能力粒度禁用某些 server API(例如禁用 network.fetch / 文件上传),可在 kitstudio.config.json 增加:
{
"capabilities": {
"allow": ["network.fetch", "files", "kit-packages"],
"deny": ["network.fetch"]
}
}allow非空时为白名单;deny永远优先生效。- 当前覆盖:
/api/network/fetch、/api/files*、/api/kit-packages*。
docs/ARCHITECTURE.mddocs/ANDROID_REMOTE_ATTACH_ACCEPTANCE.mdTODO.mdPROGRESS.md
KitStudio 的 FileStore 会把上传文件落盘到:
.kitstudio-data/(已在.gitignore忽略)