Install
openclaw skills install supernal-interfaceUniversal AI Interface framework for making applications AI-controllable. Use when adding AI tool decorators, setting up chat adapters, creating AI-callable functions, or integrating CopilotKit.
openclaw skills install supernal-interfacenpm install @supernal/interface
Decorate functions → AI can call them with full type safety.
import { Tool } from '@supernal/interface';
class TodoApp {
@Tool({
name: 'add_todo',
description: 'Add a new todo item',
category: 'productivity'
})
async addTodo(text: string): Promise<Todo> {
return this.db.create({ text, done: false });
}
@Tool({
name: 'complete_todo',
description: 'Mark a todo as complete'
})
async completeTodo(id: string): Promise<void> {
await this.db.update(id, { done: true });
}
}
import { createCopilotKitAdapter, ChatUIProvider } from '@supernal/interface';
const adapter = createCopilotKitAdapter({
autoRegisterTools: true,
autoRegisterReadables: true
});
function App() {
return (
<ChatUIProvider adapter={adapter}>
<YourApp />
</ChatUIProvider>
);
}
AI assistants can now discover and call your decorated functions.
| Decorator | Purpose |
|---|---|
@Tool | Expose function as AI-callable tool |
@ToolProvider | Class containing multiple tools |
@Component | React component with AI context |
import { createCopilotKitAdapter } from '@supernal/interface';
const adapter = createCopilotKitAdapter({
autoRegisterTools: true
});
import { ChatUIAdapter } from '@supernal/interface';
class MyAdapter implements ChatUIAdapter {
name = 'my-adapter';
registerTools(tools) { /* convert to your format */ }
render(props) { return <MyChat {...props} />; }
}
import { useToolBinding, usePersistedState, useChatWithContext } from '@supernal/interface';
// Bind a tool to component state
const [todos, setTodos] = useToolBinding('todos', []);
// Persist state across sessions
const [prefs, setPrefs] = usePersistedState('user-prefs', defaults);
// Chat with app context
const { messages, send } = useChatWithContext();
import { StateManager, LocalStorageAdapter } from '@supernal/interface/storage';
const storage = StateManager.getInstance('myapp', new LocalStorageAdapter());
await storage.setState('user', { name: 'Alice' });
import { GherkinParser, TestRunner } from '@supernal/interface/testing';
const feature = GherkinParser.parseFeature(gherkinText);
const tests = await TestRunner.generateTests({ framework: 'jest' });
Available at supernal.ai/enterprise: