From 2d9bc908e1a91f72b7d1a718d38a1ababc5a4548 Mon Sep 17 00:00:00 2001 From: ringo Date: Sun, 20 Sep 2026 17:42:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(runtime):=20=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=9A=8F=20open=5Fstudio=20=E6=9C=AC=E6=9C=BA=E5=9B=9E?= =?UTF-8?q?=E8=90=BD=E6=9B=B4=E6=96=B0=EF=BC=88f236e99=EF=BC=89=EF=BC=8Cst?= =?UTF-8?q?udio=200.3.17=20/=20writer=200.1.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/studio/.codex-plugin/plugin.json | 2 +- plugins/studio/package-lock.json | 4 +- plugins/studio/package.json | 2 +- plugins/studio/runtime/dist/deta-mcp.mjs | 47 +++++++++++++++++++++--- plugins/studio/runtime/manifest.json | 10 ++--- plugins/writer/.codex-plugin/plugin.json | 2 +- plugins/writer/package-lock.json | 4 +- plugins/writer/package.json | 2 +- plugins/writer/runtime/dist/deta-mcp.mjs | 47 +++++++++++++++++++++--- plugins/writer/runtime/manifest.json | 10 ++--- 10 files changed, 102 insertions(+), 28 deletions(-) diff --git a/plugins/studio/.codex-plugin/plugin.json b/plugins/studio/.codex-plugin/plugin.json index 5a1601d..023ea80 100644 --- a/plugins/studio/.codex-plugin/plugin.json +++ b/plugins/studio/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "studio", - "version": "0.3.16", + "version": "0.3.17", "description": "DETA Studio 插件:以 AML 为唯一事实源编辑建筑模型,编译为建筑模型并执行规则校验。", "author": { "name": "DETA", diff --git a/plugins/studio/package-lock.json b/plugins/studio/package-lock.json index dacdc3e..65ab519 100644 --- a/plugins/studio/package-lock.json +++ b/plugins/studio/package-lock.json @@ -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" } } diff --git a/plugins/studio/package.json b/plugins/studio/package.json index 4454beb..c8ade7f 100644 --- a/plugins/studio/package.json +++ b/plugins/studio/package.json @@ -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", diff --git a/plugins/studio/runtime/dist/deta-mcp.mjs b/plugins/studio/runtime/dist/deta-mcp.mjs index dbb83ac..7711cfc 100644 --- a/plugins/studio/runtime/dist/deta-mcp.mjs +++ b/plugins/studio/runtime/dist/deta-mcp.mjs @@ -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; diff --git a/plugins/studio/runtime/manifest.json b/plugins/studio/runtime/manifest.json index 8457a57..daaff9d 100644 --- a/plugins/studio/runtime/manifest.json +++ b/plugins/studio/runtime/manifest.json @@ -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" } diff --git a/plugins/writer/.codex-plugin/plugin.json b/plugins/writer/.codex-plugin/plugin.json index fd5891b..0d4206b 100644 --- a/plugins/writer/.codex-plugin/plugin.json +++ b/plugins/writer/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "writer", - "version": "0.1.7", + "version": "0.1.8", "description": "DETA Writer 插件:读取建筑模型与模拟结果,产出报告 / 文档内容。", "author": { "name": "DETA", diff --git a/plugins/writer/package-lock.json b/plugins/writer/package-lock.json index 6c553dc..26a62f0 100644 --- a/plugins/writer/package-lock.json +++ b/plugins/writer/package-lock.json @@ -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" } } diff --git a/plugins/writer/package.json b/plugins/writer/package.json index 7604078..a2655a8 100644 --- a/plugins/writer/package.json +++ b/plugins/writer/package.json @@ -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", diff --git a/plugins/writer/runtime/dist/deta-mcp.mjs b/plugins/writer/runtime/dist/deta-mcp.mjs index dbb83ac..7711cfc 100644 --- a/plugins/writer/runtime/dist/deta-mcp.mjs +++ b/plugins/writer/runtime/dist/deta-mcp.mjs @@ -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; diff --git a/plugins/writer/runtime/manifest.json b/plugins/writer/runtime/manifest.json index 001d62f..4793d79 100644 --- a/plugins/writer/runtime/manifest.json +++ b/plugins/writer/runtime/manifest.json @@ -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" }