@enc-protocol/plugin-contract
v0.9.0
Published
Universal plugin contract for ENC protocol apps. Slot types, Plugin discovery convention, registration helpers.
Downloads
120
Readme
@enc-protocol/plugin-contract
Universal plugin contract for ENC protocol apps. Provides:
- Slot constants (
Slots.RankerFn,Slots.EncryptFn, etc.) — the canonical string ids that match the Lean abbrevs the translator emits. PluginSlottype descriptor — what every plugin package'sslotexport must look like.verifyPluginRequires(slot, sample)— runtime check that an app's record shape satisfies a plugin's structural requirements.discoverPlugin(mod)— extracts{ slot, impl }from an imported plugin module (handles the convention of default-export OR named-export).
How to use as a plugin author
Your package looks like this:
// my-ranker/index.mjs
export const slot = {
id: 'RankerFn',
side: 'either',
signature: 'Identity -> Store -> Post -> Int',
requires: { record: ['likeCount', 'replyCount', 'createdAt', 'authorId'] },
};
export function rank(identity, store, post) {
/* ... */
}
export default rank;That's it. The runtime layer (SDK / dataview / enclave) imports your module,
calls discoverPlugin, and registers impl against slot.id.
How to use as a runtime author
import { discoverPlugin, verifyPluginRequires } from '@enc-protocol/plugin-contract';
import * as rankerModule from '@enc-protocol/plugin-ranker-engagement';
const d = discoverPlugin(rankerModule);
if (d.ok) {
// Optional: check the record-shape requirement before binding
const sample = await store.firstRow('posts');
const v = verifyPluginRequires(d.slot, sample);
if (!v.ok) throw new Error(`incompatible: missing fields ${v.missing}`);
sdk.registerPlugin(d.slot.id, d.impl);
}