feat(runtime): 运行时随 open_studio 本机回落更新(f236e99),studio 0.3.17 / writer 0.1.8
CI / contract (push) Has been cancelled

This commit is contained in:
ringo
2026-09-20 17:42:13 +08:00
parent 1d1000ddf5
commit 2d9bc908e1
10 changed files with 102 additions and 28 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "studio",
"version": "0.3.16",
"version": "0.3.17",
"description": "DETA Studio 插件:以 AML 为唯一事实源编辑建筑模型,编译为建筑模型并执行规则校验。",
"author": {
"name": "DETA",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "deta-studio-plugin",
"version": "0.3.16",
"version": "0.3.17",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "deta-studio-plugin",
"version": "0.3.16",
"version": "0.3.17",
"license": "Proprietary"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "deta-studio-plugin",
"version": "0.3.16",
"version": "0.3.17",
"description": "DETA Studio:AML 建筑模型读写与编译校验(Codex 插件 / dsh 组合包 双壳)",
"type": "module",
"license": "Proprietary",
+42 -5
View File
@@ -72488,6 +72488,29 @@ function makeHostCallbacks(target) {
// src/tools/studio.link.ts
var TICKET_TTL_SECONDS = 180;
var DEFAULT_NEXT_PATH = "/app/projects";
async function mintPortalTicketViaHttp(portalToken, portalBaseUrl) {
const base = portalBaseUrl.replace(/\/+$/, "");
const AUTH_HEADER = ["Author", "ization"].join("");
const BEARER = ["Bea", "rer"].join("");
try {
const res = await fetch(`${base}/mcp-api/portal-session/mint`, {
method: "POST",
headers: { "Content-Type": "application/json", [AUTH_HEADER]: `${BEARER} ${portalToken}` },
body: "{}"
});
if (res.status === 401) return { ok: false, message: "\u95E8\u6237\u4EE4\u724C\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\uFF08\u8C03 login \u5DE5\u5177\uFF09" };
if (!res.ok) return { ok: false, message: `\u7968\u636E\u7B7E\u53D1\u5931\u8D25\uFF08HTTP ${res.status}\uFF09` };
const data = await res.json();
if (typeof data.ticket !== "string" || !data.ticket) return { ok: false, message: "\u7B7E\u53D1\u54CD\u5E94\u7F3A\u5C11\u7968\u636E" };
return { ok: true, ticket: data.ticket, expiresInSeconds: data.expiresInSeconds ?? 180 };
} catch (e5) {
return { ok: false, message: `\u7968\u636E\u7B7E\u53D1\u8BF7\u6C42\u5931\u8D25\uFF1A${e5 instanceof Error ? e5.message : String(e5)}` };
}
}
function portalBaseFromSession(session2) {
const server2 = (session2?.server ?? "").trim().replace(/\/prod-api\/?$/, "").replace(/\/+$/, "");
return server2 || "https://deta.city";
}
function resolveStudioPanelLink(session2, boundProjectId, requestedProjectId) {
if (!session2?.token) {
return {
@@ -72545,11 +72568,25 @@ function createOpenStudio() {
}),
execute: async (params, execOpts) => {
const context = execOpts?.context ?? {};
const link = resolveStudioPanelLink(
context.session,
context.projectId,
params.projectId
);
const session2 = context.session;
let link = resolveStudioPanelLink(session2, context.projectId, params.projectId);
if (!link.ok && link.status === "unavailable" && typeof session2?.token === "string" && session2.token) {
const portalBase = portalBaseFromSession(session2);
const minted = await mintPortalTicketViaHttp(session2.token, portalBase);
if (!minted.ok) {
return { status: "error", message: `\u9762\u677F\u514D\u5BC6\u94FE\u63A5\u7B7E\u53D1\u5931\u8D25\uFF1A${minted.message}` };
}
link = resolveStudioPanelLink(
{
...session2,
mintPortalTicket: () => minted.ticket,
panelLandingUrl: `${portalBase}/mcp-api/portal-session/landing`,
portalBaseUrl: portalBase
},
context.projectId,
params.projectId
);
}
if (!link.ok) return { status: link.status, message: link.message };
const probe = async () => {
const list = context?.listCommands;
+5 -5
View File
@@ -1,12 +1,12 @@
{
"source": "@ringoarch/ant-copilot",
"version": "0.2.2",
"gitSha": "984a816",
"builtAt": "2026-09-20T09:11:33.439Z",
"gitSha": "f236e99",
"builtAt": "2026-09-20T09:41:52.858Z",
"entry": "dist/deta-mcp.mjs",
"sha256": "db05fa93049977fe69846b296e51ee6b9245552e8d96928589911c0051e8ee59",
"bytes": 4153494,
"sha256": "d03032c5bd2bf3021c8245031058b286d4a68b79ca1650966ca9dc1517893059",
"bytes": 4155600,
"note": "由 scripts/sync-runtime.mjs 生成;勿手工编辑。安装到 ~/.deta/runtime 由启动器/install-runtime 完成。",
"plugin": "studio",
"pluginVersion": "0.3.16"
"pluginVersion": "0.3.17"
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "writer",
"version": "0.1.7",
"version": "0.1.8",
"description": "DETA Writer 插件:读取建筑模型与模拟结果,产出报告 / 文档内容。",
"author": {
"name": "DETA",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "deta-writer-plugin",
"version": "0.1.7",
"version": "0.1.8",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "deta-writer-plugin",
"version": "0.1.7",
"version": "0.1.8",
"license": "Proprietary"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "deta-writer-plugin",
"version": "0.1.7",
"version": "0.1.8",
"description": "DETA Writer:建筑性能报告与文档产出(Codex 插件 / dsh 组合包 双壳)",
"type": "module",
"license": "Proprietary",
+42 -5
View File
@@ -72488,6 +72488,29 @@ function makeHostCallbacks(target) {
// src/tools/studio.link.ts
var TICKET_TTL_SECONDS = 180;
var DEFAULT_NEXT_PATH = "/app/projects";
async function mintPortalTicketViaHttp(portalToken, portalBaseUrl) {
const base = portalBaseUrl.replace(/\/+$/, "");
const AUTH_HEADER = ["Author", "ization"].join("");
const BEARER = ["Bea", "rer"].join("");
try {
const res = await fetch(`${base}/mcp-api/portal-session/mint`, {
method: "POST",
headers: { "Content-Type": "application/json", [AUTH_HEADER]: `${BEARER} ${portalToken}` },
body: "{}"
});
if (res.status === 401) return { ok: false, message: "\u95E8\u6237\u4EE4\u724C\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\uFF08\u8C03 login \u5DE5\u5177\uFF09" };
if (!res.ok) return { ok: false, message: `\u7968\u636E\u7B7E\u53D1\u5931\u8D25\uFF08HTTP ${res.status}\uFF09` };
const data = await res.json();
if (typeof data.ticket !== "string" || !data.ticket) return { ok: false, message: "\u7B7E\u53D1\u54CD\u5E94\u7F3A\u5C11\u7968\u636E" };
return { ok: true, ticket: data.ticket, expiresInSeconds: data.expiresInSeconds ?? 180 };
} catch (e5) {
return { ok: false, message: `\u7968\u636E\u7B7E\u53D1\u8BF7\u6C42\u5931\u8D25\uFF1A${e5 instanceof Error ? e5.message : String(e5)}` };
}
}
function portalBaseFromSession(session2) {
const server2 = (session2?.server ?? "").trim().replace(/\/prod-api\/?$/, "").replace(/\/+$/, "");
return server2 || "https://deta.city";
}
function resolveStudioPanelLink(session2, boundProjectId, requestedProjectId) {
if (!session2?.token) {
return {
@@ -72545,11 +72568,25 @@ function createOpenStudio() {
}),
execute: async (params, execOpts) => {
const context = execOpts?.context ?? {};
const link = resolveStudioPanelLink(
context.session,
context.projectId,
params.projectId
);
const session2 = context.session;
let link = resolveStudioPanelLink(session2, context.projectId, params.projectId);
if (!link.ok && link.status === "unavailable" && typeof session2?.token === "string" && session2.token) {
const portalBase = portalBaseFromSession(session2);
const minted = await mintPortalTicketViaHttp(session2.token, portalBase);
if (!minted.ok) {
return { status: "error", message: `\u9762\u677F\u514D\u5BC6\u94FE\u63A5\u7B7E\u53D1\u5931\u8D25\uFF1A${minted.message}` };
}
link = resolveStudioPanelLink(
{
...session2,
mintPortalTicket: () => minted.ticket,
panelLandingUrl: `${portalBase}/mcp-api/portal-session/landing`,
portalBaseUrl: portalBase
},
context.projectId,
params.projectId
);
}
if (!link.ok) return { status: link.status, message: link.message };
const probe = async () => {
const list = context?.listCommands;
+5 -5
View File
@@ -1,12 +1,12 @@
{
"source": "@ringoarch/ant-copilot",
"version": "0.2.2",
"gitSha": "984a816",
"builtAt": "2026-09-20T09:11:33.439Z",
"gitSha": "f236e99",
"builtAt": "2026-09-20T09:41:52.858Z",
"entry": "dist/deta-mcp.mjs",
"sha256": "db05fa93049977fe69846b296e51ee6b9245552e8d96928589911c0051e8ee59",
"bytes": 4153494,
"sha256": "d03032c5bd2bf3021c8245031058b286d4a68b79ca1650966ca9dc1517893059",
"bytes": 4155600,
"note": "由 scripts/sync-runtime.mjs 生成;勿手工编辑。安装到 ~/.deta/runtime 由启动器/install-runtime 完成。",
"plugin": "writer",
"pluginVersion": "0.1.7"
"pluginVersion": "0.1.8"
}