feat(runtime): 领域服务运行时随插件分发 + 启动器自动供给(修 P0:同事机器无开发检出就起不来)
CI / contract (push) Has been cancelled

根因:启动器的运行时解析第三顺位是开发检出 ~/Dev/ant/ant-copilot,同事机器没有该目录 → 插件装上、MCP 起不来;而私有 registry 匿名读返回 401,走 npm 安装等于要求每台机器都配 Gitea token。

改法:① 打包产物随插件分发(plugins/<产品>/runtime/,3.96MB 自包含单文件 + manifest 记录来源版本/提交/大小/sha256);② 启动器每次拉起比对 sha256,缺失或被改动即从插件包安装到 ~/.deta/runtime(首次启动零操作、升级自动同步);③ 新增 deta install-runtime(显式安装 + 补装可选依赖 @resvg/resvg-js + 装完立刻做一次真实 MCP 握手自证),status/doctor 显示运行时来源与预览图依赖状态;④ 契约校验加 E6:运行时包必须自洽(sha256/字节数/manifest.pluginVersion 与插件版本一致),拦住“升版本忘重跑 sync-runtime”。

实测:全新 HOME(模拟同事机器、无开发检出、无凭据)下供给探针 10/10 通过 —— 首次启动自动安装、启动行指向沙箱运行时、install-runtime 握手 39 个工具、重复安装幂等、运行时被改动自动修复、插件包缺运行时两处都给打包缺陷指引;已装副本 0.3.14 独立验证(含 npm 自动补装 @resvg 2 包)。studio 0.3.14 / writer 0.1.5。
This commit is contained in:
ringo
2026-09-20 16:40:33 +08:00
parent abb5835310
commit 3ab20c23b0
18 changed files with 192742 additions and 26 deletions
+29 -1
View File
@@ -26,6 +26,30 @@ while [ $# -gt 0 ]; do
esac
done
PLUGIN_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
# ── 运行时自备:插件包内自带打包产物(同事机器没有开发检出,也拿不到私有 registry)──
# 缺失或与插件包不一致时自动安装到 $HOME/.deta/runtime;只比 sha256,命中即跳过(4MB 哈希约 20ms)。
# 为什么随插件分发:私有 registry 匿名读 401,走 npm 会让每个同事机器都要配 token。
RUNTIME_DIR="$HOME/.deta/runtime"
BUNDLED="$PLUGIN_ROOT/runtime/dist/deta-mcp.mjs"
if [ -f "$BUNDLED" ]; then
WANT_SHA="$(shasum -a 256 "$BUNDLED" 2>/dev/null | cut -d' ' -f1)"
HAVE_SHA=""
if [ -f "$RUNTIME_DIR/dist/deta-mcp.mjs" ]; then
HAVE_SHA="$(shasum -a 256 "$RUNTIME_DIR/dist/deta-mcp.mjs" 2>/dev/null | cut -d' ' -f1)"
fi
if [ -n "$WANT_SHA" ] && [ "$WANT_SHA" != "$HAVE_SHA" ]; then
mkdir -p "$RUNTIME_DIR/dist" 2>/dev/null || true
if cp "$BUNDLED" "$RUNTIME_DIR/dist/deta-mcp.mjs" 2>/dev/null; then
if [ -f "$PLUGIN_ROOT/runtime/manifest.json" ]; then
cp "$PLUGIN_ROOT/runtime/manifest.json" "$RUNTIME_DIR/manifest.json" 2>/dev/null || true
fi
echo "[deta] 已从插件包安装运行时到 ${RUNTIME_DIR}" >&2
fi
fi
fi
# ── 运行时解析:显式 DETA_SERVER_ROOT → 本机引擎包安装位置 → 本机开发检出(打印提示)──
ROOT="${DETA_SERVER_ROOT:-}"
if [ -z "$ROOT" ]; then
@@ -70,7 +94,6 @@ export DETA_TOOL_SURFACE="${DETA_SURFACE:-full}"
# ── 稳定入口:把命令行门面注册为 ~/.deta/bin/deta(幂等,路径随插件更新自动刷新)──
# 插件装在宿主缓存目录,用户看不见这个路径;而用户与工具回执都需要一条可复制的命令。
PLUGIN_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BIN_DIR="$HOME/.deta/bin"
SHIM="$BIN_DIR/deta"
SHIM_BODY="#!/bin/sh
@@ -123,4 +146,9 @@ fi
echo "[deta] 档位=${PROFILE} 运行时=${ROOT} 工作区=${WS} 工具面=${DETA_TOOL_SURFACE} 云令牌=${CLOUD_STATE} 网关桥=${BRIDGE_STATE}" >&2
# ── 可选依赖提示:缺 @resvg/resvg-js 只影响候选预览图,其余能力不受影响 ──
if [ ! -f "$ROOT/node_modules/@resvg/resvg-js/package.json" ]; then
echo "[deta] 提示:候选预览图需要 @resvg/resvg-js;运行 ~/.deta/bin/deta install-runtime 补装(其余能力不受影响)" >&2
fi
exec node "$ENTRY" "$@"