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; }