Files
memind/mindspace-server-adapter-contract.mjs
john e2ad3bf62b feat(mindspace): 公开页分享组件、workspace 路径与 Plaza 发布增强
- 新增 public share widget 与 workspace relative path 解析
- 增强 publications/chat-plaza 发布链路与缩略图 demo
- 补充 schema、cover 检查脚本与回归测试

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 23:14:41 +08:00

106 lines
2.9 KiB
JavaScript

export const MINDSPACE_SERVER_ADAPTER_BINDINGS = Object.freeze({
serviceFacade: Object.freeze(['prepareConversationPackageRead']),
conversationPackageRegistry: Object.freeze([
'ensurePackage',
'putObjectForSession',
'recordArtifact',
'readArtifactObject',
'readManifestForSession',
'writeManifestForSession',
]),
assetService: Object.freeze([
'cancelUpload',
'claimUploadArtifactsForConversation',
'completeUpload',
'createChatAsset',
'createUpload',
'deleteAsset',
'listAssets',
'readAsset',
'readPublicAsset',
'renderAssetPreview',
'renderAssetThumbnail',
'syncWorkspaceAssets',
'writeUploadContent',
'expireStaleUploads',
]),
pageService: Object.freeze([
'createFromChat',
'createPage',
'deletePage',
'findPageByRelativePath',
'findPageBySourceAsset',
'findPageBySourceMessage',
'findPlazaContextByWorkspacePath',
'getDeletePreview',
'getPage',
'listPages',
'listVersions',
'localizePrivateResources',
'redactPage',
'regenerateThumbnail',
'renderDraftPreview',
'renderPreview',
'renderThumbnail',
'rewriteHtmlDownloadLinksForPage',
'updatePage',
'uploadThumbnail',
]),
pageSyncService: Object.freeze(['syncUserGeneratedPages']),
pageLiveEditService: Object.freeze(['applyAgentPatch', 'bindSession', 'getRevisionSnapshot']),
assetAgentService: Object.freeze(['applyAgentDelete']),
publicationService: Object.freeze([
'check',
'cleanupExpiredUnconfirmedPublications',
'getCurrent',
'getPublicHomepage',
'getStats',
'offline',
'publish',
'refreshOnlinePublicationHtml',
'resolvePrivateLink',
'resolvePublic',
'updatePublicationStatus',
]),
cleanupService: Object.freeze(['listCandidates', 'runCleanup']),
agentJobService: Object.freeze([
'cancelJob',
'claimJob',
'claimNextJob',
'completeJob',
'createJob',
'getAssetForJob',
'getJob',
'heartbeat',
'listJobs',
'reapStaleJobs',
'retryJob',
]),
});
export const MINDSPACE_SERVER_ADAPTER_BINDING_KEYS = Object.freeze(
Object.keys(MINDSPACE_SERVER_ADAPTER_BINDINGS),
);
export function assertMindSpaceServerAdapterBindingContract(bindingKey, service) {
const methods = MINDSPACE_SERVER_ADAPTER_BINDINGS[bindingKey];
if (!methods) {
throw new Error(`Unknown MindSpace server adapter binding: ${bindingKey}`);
}
for (const method of methods) {
if (typeof service?.[method] !== 'function') {
throw new Error(
`MindSpace server adapter binding "${bindingKey}" is missing method ${bindingKey}.${method}()`,
);
}
}
return service;
}
export function assertMindSpaceServerAdapterBindings(bindings) {
for (const bindingKey of MINDSPACE_SERVER_ADAPTER_BINDING_KEYS) {
assertMindSpaceServerAdapterBindingContract(bindingKey, bindings?.[bindingKey]);
}
return bindings;
}