Files
memind/mindspace-server-adapter-contract.mjs
T
john d3239ff292 fix: MindSpace remote sync, thumbnail fallback, and Plaza URL guards
Ensure page sync runs via pageSyncService in remote mode, fall back to
workspace HTML when storage assets are missing, and prevent production
Portal from linking to loopback Plaza URLs baked in at build time.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 07:57:04 +08:00

103 lines
2.8 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',
'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',
'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;
}