fix(plaza): delegate thumbnail regen to chatSave authority boundary
Memind CI / Test, build, and release guards (push) Successful in 3m19s
Memind CI / Test, build, and release guards (push) Successful in 3m19s
Portal chat-share routes must not resolve workspace publish dirs directly; quick-plaza flows now call mindSpaceChatSave.ensurePreviewThumbnail instead. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+21
-21
@@ -255,8 +255,7 @@ export async function quickPlazaFromChat({
|
||||
mindSpacePages,
|
||||
mindSpacePublications,
|
||||
plazaPosts,
|
||||
ensureWorkspaceHtmlThumbnail,
|
||||
publishDir,
|
||||
mindSpaceChatSave,
|
||||
}) {
|
||||
if (!mindSpacePages || !mindSpacePublications || !plazaPosts) {
|
||||
throw Object.assign(new Error('Plaza 或 MindSpace 未启用'), { code: 'plaza_unavailable' });
|
||||
@@ -267,29 +266,26 @@ export async function quickPlazaFromChat({
|
||||
userId: user.id,
|
||||
bundle,
|
||||
mindSpacePages,
|
||||
ensureWorkspaceHtmlThumbnail,
|
||||
publishDir,
|
||||
body,
|
||||
skipThumbnail: !ensureWorkspaceHtmlThumbnail || !publishDir,
|
||||
skipThumbnail: true,
|
||||
});
|
||||
|
||||
if (
|
||||
analysis.contentMode === 'static_html' &&
|
||||
analysis.relativePath &&
|
||||
resolvedHtml?.content &&
|
||||
ensureWorkspaceHtmlThumbnail &&
|
||||
publishDir
|
||||
mindSpaceChatSave?.ensurePreviewThumbnail
|
||||
) {
|
||||
await ensureWorkspaceHtmlThumbnail(
|
||||
publishDir,
|
||||
analysis.relativePath,
|
||||
resolvedHtml.content,
|
||||
{
|
||||
await mindSpaceChatSave
|
||||
.ensurePreviewThumbnail({
|
||||
userId: user.id,
|
||||
relativePath: analysis.relativePath,
|
||||
html: resolvedHtml.content,
|
||||
title: page.title,
|
||||
subtitle: page.summary,
|
||||
force: true,
|
||||
},
|
||||
).catch(() => {});
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
if (analysis.contentMode === 'static_html' && analysis.relativePath) {
|
||||
@@ -394,8 +390,7 @@ export async function quickPlazaFromPublicHtml({
|
||||
mindSpacePublications,
|
||||
plazaPosts,
|
||||
readWorkspaceHtml,
|
||||
ensureWorkspaceHtmlThumbnail,
|
||||
publishDir,
|
||||
mindSpaceChatSave,
|
||||
}) {
|
||||
if (!mindSpacePages || !mindSpacePublications || !plazaPosts) {
|
||||
throw Object.assign(new Error('Plaza 或 MindSpace 未启用'), { code: 'plaza_unavailable' });
|
||||
@@ -421,11 +416,16 @@ export async function quickPlazaFromPublicHtml({
|
||||
});
|
||||
|
||||
const title = titleFromPublicHtml(content, normalized);
|
||||
if (ensureWorkspaceHtmlThumbnail && publishDir) {
|
||||
await ensureWorkspaceHtmlThumbnail(publishDir, normalized, content, {
|
||||
title,
|
||||
force: true,
|
||||
}).catch(() => {});
|
||||
if (mindSpaceChatSave?.ensurePreviewThumbnail) {
|
||||
await mindSpaceChatSave
|
||||
.ensurePreviewThumbnail({
|
||||
userId: user.id,
|
||||
relativePath: normalized,
|
||||
html: content,
|
||||
title,
|
||||
force: true,
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
const page = await ensureWorkspaceHtmlPageForPlaza({
|
||||
|
||||
@@ -3,8 +3,6 @@ import {
|
||||
quickPlazaFromChat,
|
||||
quickPlazaFromPublicHtml,
|
||||
} from '../mindspace-chat-plaza.mjs';
|
||||
import { resolveMindSpaceUserPublishDir } from '../mindspace-runtime-config.mjs';
|
||||
import { ensureWorkspaceHtmlThumbnail } from '../mindspace-workspace-thumbnails.mjs';
|
||||
|
||||
function assertRouter(api) {
|
||||
if (
|
||||
@@ -43,8 +41,6 @@ export function attachPortalMindSpaceChatShareRoutes(
|
||||
getQuickPlazaFromPublicHtmlStatusFn =
|
||||
getQuickPlazaFromPublicHtmlStatus,
|
||||
quickPlazaFromPublicHtmlFn = quickPlazaFromPublicHtml,
|
||||
ensureWorkspaceHtmlThumbnailFn = ensureWorkspaceHtmlThumbnail,
|
||||
resolveMindSpaceUserPublishDirFn = resolveMindSpaceUserPublishDir,
|
||||
now = Date.now,
|
||||
logger = console,
|
||||
} = {},
|
||||
@@ -100,9 +96,10 @@ export function attachPortalMindSpaceChatShareRoutes(
|
||||
|
||||
api.post('/mindspace/v1/pages/quick-plaza-from-chat', async (req, res) => {
|
||||
const pages = getMindSpacePages();
|
||||
const chatSave = getMindSpaceChatSave();
|
||||
const publications = getMindSpacePublications();
|
||||
const plazaPosts = getPlazaPosts();
|
||||
if (!pages || !publications || !plazaPosts) {
|
||||
if (!pages || !chatSave || !publications || !plazaPosts) {
|
||||
return sendError(
|
||||
res,
|
||||
req,
|
||||
@@ -118,7 +115,6 @@ export function attachPortalMindSpaceChatShareRoutes(
|
||||
h5Root,
|
||||
req.body,
|
||||
);
|
||||
const publishDir = resolveMindSpaceUserPublishDirFn(h5Root, req.currentUser);
|
||||
const result = await quickPlazaFromChatFn({
|
||||
user: req.currentUser,
|
||||
bundle,
|
||||
@@ -126,8 +122,7 @@ export function attachPortalMindSpaceChatShareRoutes(
|
||||
mindSpacePages: pages,
|
||||
mindSpacePublications: publications,
|
||||
plazaPosts,
|
||||
ensureWorkspaceHtmlThumbnail: ensureWorkspaceHtmlThumbnailFn,
|
||||
publishDir,
|
||||
mindSpaceChatSave: chatSave,
|
||||
});
|
||||
logger.info('[quick-plaza] ok', {
|
||||
ms: now() - startedAt,
|
||||
@@ -221,7 +216,6 @@ export function attachPortalMindSpaceChatShareRoutes(
|
||||
req.body?.relativePath ??
|
||||
'',
|
||||
).trim();
|
||||
const publishDir = resolveMindSpaceUserPublishDirFn(h5Root, req.currentUser);
|
||||
const result = await quickPlazaFromPublicHtmlFn({
|
||||
user: req.currentUser,
|
||||
relativePath,
|
||||
@@ -230,8 +224,7 @@ export function attachPortalMindSpaceChatShareRoutes(
|
||||
plazaPosts,
|
||||
readWorkspaceHtml: (input) =>
|
||||
chatSave.readWorkspaceHtml(input),
|
||||
ensureWorkspaceHtmlThumbnail: ensureWorkspaceHtmlThumbnailFn,
|
||||
publishDir,
|
||||
mindSpaceChatSave: chatSave,
|
||||
});
|
||||
const plazaUrl = resolvePlazaPostUrl(
|
||||
result.post.id,
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import { attachPortalMindSpaceChatShareRoutes } from './portal-mindspace-chat-share-routes.mjs';
|
||||
import { resolveMindSpaceUserPublishDir } from '../mindspace-runtime-config.mjs';
|
||||
import { ensureWorkspaceHtmlThumbnail } from '../mindspace-workspace-thumbnails.mjs';
|
||||
|
||||
function createRouterRecorder() {
|
||||
const routes = new Map();
|
||||
@@ -196,8 +194,7 @@ test('quick Plaza from chat preserves dependencies, timing, result, and errors',
|
||||
mindSpacePages: dependencies.services.pages,
|
||||
mindSpacePublications: dependencies.services.publications,
|
||||
plazaPosts: dependencies.services.plazaPosts,
|
||||
ensureWorkspaceHtmlThumbnail,
|
||||
publishDir: resolveMindSpaceUserPublishDir('/workspace', req.currentUser),
|
||||
mindSpaceChatSave: dependencies.services.chatSave,
|
||||
});
|
||||
|
||||
const failureApi = createRouterRecorder();
|
||||
|
||||
Reference in New Issue
Block a user