fix(launcher): 注入 ANT_WORKSPACE_BRIDGE_URL(云项目写入前置),studio 0.3.8
CI / contract (push) Has been cancelled

缺该 env 时 build_model 无法写云项目、退回只写本地工作区(用户以为已同步)。启动器改为:显式 env → 本机 127.0.0.1:3180 探测(dev 网关)→ 生产 https://deta.city/workspace-api,并把解析结果打进启动行(网关桥=…)便于排查。

陷阱:探测写成 (exec 3<>/dev/tcp/...) 后不要紧跟 exec 3<&- —— 父 shell 无该 fd 时在 set -e 下会直接退出脚本(症状:启动行只剩一行提示、MCP 不启)。
This commit is contained in:
ringo
2026-09-20 14:12:50 +08:00
parent ec9db45b6a
commit ef6a174255
5 changed files with 36 additions and 6 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "studio", "name": "studio",
"version": "0.3.7", "version": "0.3.8",
"description": "DETA Studio 插件:以 AML 为唯一事实源编辑建筑模型,编译为建筑模型并执行规则校验。", "description": "DETA Studio 插件:以 AML 为唯一事实源编辑建筑模型,编译为建筑模型并执行规则校验。",
"author": { "author": {
"name": "DETA", "name": "DETA",
+16 -1
View File
@@ -100,12 +100,27 @@ if [ -z "${DETA_TOKEN:-}" ] && [ -f "$HOME/.deta/credentials.json" ]; then
if [ -n "${DETA_TOKEN:-}" ]; then TOKEN_SOURCE="$HOME/.deta/credentials.json"; fi if [ -n "${DETA_TOKEN:-}" ]; then TOKEN_SOURCE="$HOME/.deta/credentials.json"; fi
fi fi
# ── 网关桥(云项目工作区读写 / host-call 中继):显式 env → 本机网关 → 生产网关 ──
# 缺它时 build_model 无法把模型写进云项目(会退回只写本地工作区),用户会以为已同步。
if [ -z "${ANT_WORKSPACE_BRIDGE_URL:-}" ]; then
if (exec 3<>/dev/tcp/127.0.0.1/3180) 2>/dev/null; then
ANT_WORKSPACE_BRIDGE_URL="http://127.0.0.1:3180"
BRIDGE_STATE="本机网关 ${ANT_WORKSPACE_BRIDGE_URL}"
else
ANT_WORKSPACE_BRIDGE_URL="https://deta.city/workspace-api"
BRIDGE_STATE="生产网关 ${ANT_WORKSPACE_BRIDGE_URL}"
fi
export ANT_WORKSPACE_BRIDGE_URL
else
BRIDGE_STATE="环境变量 ${ANT_WORKSPACE_BRIDGE_URL}"
fi
if [ -n "${DETA_TOKEN:-}" ]; then if [ -n "${DETA_TOKEN:-}" ]; then
CLOUD_STATE="已注入(来源=${TOKEN_SOURCE})" CLOUD_STATE="已注入(来源=${TOKEN_SOURCE})"
else else
CLOUD_STATE="未注入——云类工具返回 auth_required 时调 login 工具(浏览器点一下即可);无该工具的形态用 ~/.deta/bin/deta login" CLOUD_STATE="未注入——云类工具返回 auth_required 时调 login 工具(浏览器点一下即可);无该工具的形态用 ~/.deta/bin/deta login"
fi fi
echo "[deta] 档位=${PROFILE} 运行时=${ROOT} 工作区=${WS} 工具面=${DETA_TOOL_SURFACE} 云令牌=${CLOUD_STATE}" >&2 echo "[deta] 档位=${PROFILE} 运行时=${ROOT} 工作区=${WS} 工具面=${DETA_TOOL_SURFACE} 云令牌=${CLOUD_STATE} 网关桥=${BRIDGE_STATE}" >&2
exec node "$ENTRY" "$@" exec node "$ENTRY" "$@"
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "deta-studio-plugin", "name": "deta-studio-plugin",
"version": "0.3.7", "version": "0.3.8",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "deta-studio-plugin", "name": "deta-studio-plugin",
"version": "0.3.7", "version": "0.3.8",
"license": "Proprietary" "license": "Proprietary"
} }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "deta-studio-plugin", "name": "deta-studio-plugin",
"version": "0.3.7", "version": "0.3.8",
"description": "DETA Studio:AML 建筑模型读写与编译校验(Codex 插件 / dsh 组合包 双壳)", "description": "DETA Studio:AML 建筑模型读写与编译校验(Codex 插件 / dsh 组合包 双壳)",
"type": "module", "type": "module",
"license": "Proprietary", "license": "Proprietary",
+16 -1
View File
@@ -100,12 +100,27 @@ if [ -z "${DETA_TOKEN:-}" ] && [ -f "$HOME/.deta/credentials.json" ]; then
if [ -n "${DETA_TOKEN:-}" ]; then TOKEN_SOURCE="$HOME/.deta/credentials.json"; fi if [ -n "${DETA_TOKEN:-}" ]; then TOKEN_SOURCE="$HOME/.deta/credentials.json"; fi
fi fi
# ── 网关桥(云项目工作区读写 / host-call 中继):显式 env → 本机网关 → 生产网关 ──
# 缺它时 build_model 无法把模型写进云项目(会退回只写本地工作区),用户会以为已同步。
if [ -z "${ANT_WORKSPACE_BRIDGE_URL:-}" ]; then
if (exec 3<>/dev/tcp/127.0.0.1/3180) 2>/dev/null; then
ANT_WORKSPACE_BRIDGE_URL="http://127.0.0.1:3180"
BRIDGE_STATE="本机网关 ${ANT_WORKSPACE_BRIDGE_URL}"
else
ANT_WORKSPACE_BRIDGE_URL="https://deta.city/workspace-api"
BRIDGE_STATE="生产网关 ${ANT_WORKSPACE_BRIDGE_URL}"
fi
export ANT_WORKSPACE_BRIDGE_URL
else
BRIDGE_STATE="环境变量 ${ANT_WORKSPACE_BRIDGE_URL}"
fi
if [ -n "${DETA_TOKEN:-}" ]; then if [ -n "${DETA_TOKEN:-}" ]; then
CLOUD_STATE="已注入(来源=${TOKEN_SOURCE})" CLOUD_STATE="已注入(来源=${TOKEN_SOURCE})"
else else
CLOUD_STATE="未注入——云类工具返回 auth_required 时调 login 工具(浏览器点一下即可);无该工具的形态用 ~/.deta/bin/deta login" CLOUD_STATE="未注入——云类工具返回 auth_required 时调 login 工具(浏览器点一下即可);无该工具的形态用 ~/.deta/bin/deta login"
fi fi
echo "[deta] 档位=${PROFILE} 运行时=${ROOT} 工作区=${WS} 工具面=${DETA_TOOL_SURFACE} 云令牌=${CLOUD_STATE}" >&2 echo "[deta] 档位=${PROFILE} 运行时=${ROOT} 工作区=${WS} 工具面=${DETA_TOOL_SURFACE} 云令牌=${CLOUD_STATE} 网关桥=${BRIDGE_STATE}" >&2
exec node "$ENTRY" "$@" exec node "$ENTRY" "$@"